1/*
2 *  Routines for control of the AK4117 via 4-wire serial interface
3 *  IEC958 (S/PDIF) receiver by Asahi Kasei
4 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
5 *
6 *
7 *   This program is free software; you can redistribute it and/or modify
8 *   it under the terms of the GNU General Public License as published by
9 *   the Free Software Foundation; either version 2 of the License, or
10 *   (at your option) any later version.
11 *
12 *   This program is distributed in the hope that it will be useful,
13 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *   GNU General Public License for more details.
16 *
17 *   You should have received a copy of the GNU General Public License
18 *   along with this program; if not, write to the Free Software
19 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
20 *
21 */
22
23#include <linux/slab.h>
24#include <linux/delay.h>
25#include <linux/module.h>
26#include <sound/core.h>
27#include <sound/control.h>
28#include <sound/pcm.h>
29#include <sound/ak4117.h>
30#include <sound/asoundef.h>
31
32MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
33MODULE_DESCRIPTION("AK4117 IEC958 (S/PDIF) receiver by Asahi Kasei");
34MODULE_LICENSE("GPL");
35
36#define AK4117_ADDR			0x00 /* fixed address */
37
38static void snd_ak4117_timer(unsigned long data);
39
40static void reg_write(struct ak4117 *ak4117, unsigned char reg, unsigned char val)
41{
42	ak4117->write(ak4117->private_data, reg, val);
43	if (reg < sizeof(ak4117->regmap))
44		ak4117->regmap[reg] = val;
45}
46
47static inline unsigned char reg_read(struct ak4117 *ak4117, unsigned char reg)
48{
49	return ak4117->read(ak4117->private_data, reg);
50}
51
52#if 0
53static void reg_dump(struct ak4117 *ak4117)
54{
55	int i;
56
57	printk(KERN_DEBUG "AK4117 REG DUMP:\n");
58	for (i = 0; i < 0x1b; i++)
59		printk(KERN_DEBUG "reg[%02x] = %02x (%02x)\n", i, reg_read(ak4117, i), i < sizeof(ak4117->regmap) ? ak4117->regmap[i] : 0);
60}
61#endif
62
63static void snd_ak4117_free(struct ak4117 *chip)
64{
65	del_timer_sync(&chip->timer);
66	kfree(chip);
67}
68
69static int snd_ak4117_dev_free(struct snd_device *device)
70{
71	struct ak4117 *chip = device->device_data;
72	snd_ak4117_free(chip);
73	return 0;
74}
75
76int snd_ak4117_create(struct snd_card *card, ak4117_read_t *read, ak4117_write_t *write,
77		      const unsigned char pgm[5], void *private_data, struct ak4117 **r_ak4117)
78{
79	struct ak4117 *chip;
80	int err = 0;
81	unsigned char reg;
82	static struct snd_device_ops ops = {
83		.dev_free =     snd_ak4117_dev_free,
84	};
85
86	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
87	if (chip == NULL)
88		return -ENOMEM;
89	spin_lock_init(&chip->lock);
90	chip->card = card;
91	chip->read = read;
92	chip->write = write;
93	chip->private_data = private_data;
94	setup_timer(&chip->timer, snd_ak4117_timer, (unsigned long)chip);
95
96	for (reg = 0; reg < 5; reg++)
97		chip->regmap[reg] = pgm[reg];
98	snd_ak4117_reinit(chip);
99
100	chip->rcs0 = reg_read(chip, AK4117_REG_RCS0) & ~(AK4117_QINT | AK4117_CINT | AK4117_STC);
101	chip->rcs1 = reg_read(chip, AK4117_REG_RCS1);
102	chip->rcs2 = reg_read(chip, AK4117_REG_RCS2);
103
104	if ((err = snd_device_new(card, SNDRV_DEV_CODEC, chip, &ops)) < 0)
105		goto __fail;
106
107	if (r_ak4117)
108		*r_ak4117 = chip;
109	return 0;
110
111      __fail:
112	snd_ak4117_free(chip);
113	return err < 0 ? err : -EIO;
114}
115
116void snd_ak4117_reg_write(struct ak4117 *chip, unsigned char reg, unsigned char mask, unsigned char val)
117{
118	if (reg >= 5)
119		return;
120	reg_write(chip, reg, (chip->regmap[reg] & ~mask) | val);
121}
122
123void snd_ak4117_reinit(struct ak4117 *chip)
124{
125	unsigned char old = chip->regmap[AK4117_REG_PWRDN], reg;
126
127	del_timer(&chip->timer);
128	chip->init = 1;
129	/* bring the chip to reset state and powerdown state */
130	reg_write(chip, AK4117_REG_PWRDN, 0);
131	udelay(200);
132	/* release reset, but leave powerdown */
133	reg_write(chip, AK4117_REG_PWRDN, (old | AK4117_RST) & ~AK4117_PWN);
134	udelay(200);
135	for (reg = 1; reg < 5; reg++)
136		reg_write(chip, reg, chip->regmap[reg]);
137	/* release powerdown, everything is initialized now */
138	reg_write(chip, AK4117_REG_PWRDN, old | AK4117_RST | AK4117_PWN);
139	chip->init = 0;
140	mod_timer(&chip->timer, 1 + jiffies);
141}
142
143static unsigned int external_rate(unsigned char rcs1)
144{
145	switch (rcs1 & (AK4117_FS0|AK4117_FS1|AK4117_FS2|AK4117_FS3)) {
146	case AK4117_FS_32000HZ: return 32000;
147	case AK4117_FS_44100HZ: return 44100;
148	case AK4117_FS_48000HZ: return 48000;
149	case AK4117_FS_88200HZ: return 88200;
150	case AK4117_FS_96000HZ: return 96000;
151	case AK4117_FS_176400HZ: return 176400;
152	case AK4117_FS_192000HZ: return 192000;
153	default:		return 0;
154	}
155}
156
157static int snd_ak4117_in_error_info(struct snd_kcontrol *kcontrol,
158				    struct snd_ctl_elem_info *uinfo)
159{
160	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
161	uinfo->count = 1;
162	uinfo->value.integer.min = 0;
163	uinfo->value.integer.max = LONG_MAX;
164	return 0;
165}
166
167static int snd_ak4117_in_error_get(struct snd_kcontrol *kcontrol,
168				   struct snd_ctl_elem_value *ucontrol)
169{
170	struct ak4117 *chip = snd_kcontrol_chip(kcontrol);
171	long *ptr;
172
173	spin_lock_irq(&chip->lock);
174	ptr = (long *)(((char *)chip) + kcontrol->private_value);
175	ucontrol->value.integer.value[0] = *ptr;
176	*ptr = 0;
177	spin_unlock_irq(&chip->lock);
178	return 0;
179}
180
181#define snd_ak4117_in_bit_info		snd_ctl_boolean_mono_info
182
183static int snd_ak4117_in_bit_get(struct snd_kcontrol *kcontrol,
184				 struct snd_ctl_elem_value *ucontrol)
185{
186	struct ak4117 *chip = snd_kcontrol_chip(kcontrol);
187	unsigned char reg = kcontrol->private_value & 0xff;
188	unsigned char bit = (kcontrol->private_value >> 8) & 0xff;
189	unsigned char inv = (kcontrol->private_value >> 31) & 1;
190
191	ucontrol->value.integer.value[0] = ((reg_read(chip, reg) & (1 << bit)) ? 1 : 0) ^ inv;
192	return 0;
193}
194
195static int snd_ak4117_rx_info(struct snd_kcontrol *kcontrol,
196			      struct snd_ctl_elem_info *uinfo)
197{
198	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
199	uinfo->count = 1;
200	uinfo->value.integer.min = 0;
201	uinfo->value.integer.max = 1;
202	return 0;
203}
204
205static int snd_ak4117_rx_get(struct snd_kcontrol *kcontrol,
206			     struct snd_ctl_elem_value *ucontrol)
207{
208	struct ak4117 *chip = snd_kcontrol_chip(kcontrol);
209
210	ucontrol->value.integer.value[0] = (chip->regmap[AK4117_REG_IO] & AK4117_IPS) ? 1 : 0;
211	return 0;
212}
213
214static int snd_ak4117_rx_put(struct snd_kcontrol *kcontrol,
215			     struct snd_ctl_elem_value *ucontrol)
216{
217	struct ak4117 *chip = snd_kcontrol_chip(kcontrol);
218	int change;
219	u8 old_val;
220
221	spin_lock_irq(&chip->lock);
222	old_val = chip->regmap[AK4117_REG_IO];
223	change = !!ucontrol->value.integer.value[0] != ((old_val & AK4117_IPS) ? 1 : 0);
224	if (change)
225		reg_write(chip, AK4117_REG_IO, (old_val & ~AK4117_IPS) | (ucontrol->value.integer.value[0] ? AK4117_IPS : 0));
226	spin_unlock_irq(&chip->lock);
227	return change;
228}
229
230static int snd_ak4117_rate_info(struct snd_kcontrol *kcontrol,
231				struct snd_ctl_elem_info *uinfo)
232{
233	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
234	uinfo->count = 1;
235	uinfo->value.integer.min = 0;
236	uinfo->value.integer.max = 192000;
237	return 0;
238}
239
240static int snd_ak4117_rate_get(struct snd_kcontrol *kcontrol,
241			       struct snd_ctl_elem_value *ucontrol)
242{
243	struct ak4117 *chip = snd_kcontrol_chip(kcontrol);
244
245	ucontrol->value.integer.value[0] = external_rate(reg_read(chip, AK4117_REG_RCS1));
246	return 0;
247}
248
249static int snd_ak4117_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
250{
251	uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
252	uinfo->count = 1;
253	return 0;
254}
255
256static int snd_ak4117_spdif_get(struct snd_kcontrol *kcontrol,
257				struct snd_ctl_elem_value *ucontrol)
258{
259	struct ak4117 *chip = snd_kcontrol_chip(kcontrol);
260	unsigned i;
261
262	for (i = 0; i < AK4117_REG_RXCSB_SIZE; i++)
263		ucontrol->value.iec958.status[i] = reg_read(chip, AK4117_REG_RXCSB0 + i);
264	return 0;
265}
266
267static int snd_ak4117_spdif_mask_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
268{
269	uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
270	uinfo->count = 1;
271	return 0;
272}
273
274static int snd_ak4117_spdif_mask_get(struct snd_kcontrol *kcontrol,
275				      struct snd_ctl_elem_value *ucontrol)
276{
277	memset(ucontrol->value.iec958.status, 0xff, AK4117_REG_RXCSB_SIZE);
278	return 0;
279}
280
281static int snd_ak4117_spdif_pinfo(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
282{
283	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
284	uinfo->value.integer.min = 0;
285	uinfo->value.integer.max = 0xffff;
286	uinfo->count = 4;
287	return 0;
288}
289
290static int snd_ak4117_spdif_pget(struct snd_kcontrol *kcontrol,
291				 struct snd_ctl_elem_value *ucontrol)
292{
293	struct ak4117 *chip = snd_kcontrol_chip(kcontrol);
294	unsigned short tmp;
295
296	ucontrol->value.integer.value[0] = 0xf8f2;
297	ucontrol->value.integer.value[1] = 0x4e1f;
298	tmp = reg_read(chip, AK4117_REG_Pc0) | (reg_read(chip, AK4117_REG_Pc1) << 8);
299	ucontrol->value.integer.value[2] = tmp;
300	tmp = reg_read(chip, AK4117_REG_Pd0) | (reg_read(chip, AK4117_REG_Pd1) << 8);
301	ucontrol->value.integer.value[3] = tmp;
302	return 0;
303}
304
305static int snd_ak4117_spdif_qinfo(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
306{
307	uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
308	uinfo->count = AK4117_REG_QSUB_SIZE;
309	return 0;
310}
311
312static int snd_ak4117_spdif_qget(struct snd_kcontrol *kcontrol,
313				 struct snd_ctl_elem_value *ucontrol)
314{
315	struct ak4117 *chip = snd_kcontrol_chip(kcontrol);
316	unsigned i;
317
318	for (i = 0; i < AK4117_REG_QSUB_SIZE; i++)
319		ucontrol->value.bytes.data[i] = reg_read(chip, AK4117_REG_QSUB_ADDR + i);
320	return 0;
321}
322
323/* Don't forget to change AK4117_CONTROLS define!!! */
324static struct snd_kcontrol_new snd_ak4117_iec958_controls[] = {
325{
326	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
327	.name =		"IEC958 Parity Errors",
328	.access =	SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
329	.info =		snd_ak4117_in_error_info,
330	.get =		snd_ak4117_in_error_get,
331	.private_value = offsetof(struct ak4117, parity_errors),
332},
333{
334	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
335	.name =		"IEC958 V-Bit Errors",
336	.access =	SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
337	.info =		snd_ak4117_in_error_info,
338	.get =		snd_ak4117_in_error_get,
339	.private_value = offsetof(struct ak4117, v_bit_errors),
340},
341{
342	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
343	.name =		"IEC958 C-CRC Errors",
344	.access =	SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
345	.info =		snd_ak4117_in_error_info,
346	.get =		snd_ak4117_in_error_get,
347	.private_value = offsetof(struct ak4117, ccrc_errors),
348},
349{
350	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
351	.name =		"IEC958 Q-CRC Errors",
352	.access =	SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
353	.info =		snd_ak4117_in_error_info,
354	.get =		snd_ak4117_in_error_get,
355	.private_value = offsetof(struct ak4117, qcrc_errors),
356},
357{
358	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
359	.name =		"IEC958 External Rate",
360	.access =	SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
361	.info =		snd_ak4117_rate_info,
362	.get =		snd_ak4117_rate_get,
363},
364{
365	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
366	.name =		SNDRV_CTL_NAME_IEC958("",CAPTURE,MASK),
367	.access =	SNDRV_CTL_ELEM_ACCESS_READ,
368	.info =		snd_ak4117_spdif_mask_info,
369	.get =		snd_ak4117_spdif_mask_get,
370},
371{
372	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
373	.name =		SNDRV_CTL_NAME_IEC958("",CAPTURE,DEFAULT),
374	.access =	SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
375	.info =		snd_ak4117_spdif_info,
376	.get =		snd_ak4117_spdif_get,
377},
378{
379	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
380	.name =		"IEC958 Preamble Capture Default",
381	.access =	SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
382	.info =		snd_ak4117_spdif_pinfo,
383	.get =		snd_ak4117_spdif_pget,
384},
385{
386	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
387	.name =		"IEC958 Q-subcode Capture Default",
388	.access =	SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
389	.info =		snd_ak4117_spdif_qinfo,
390	.get =		snd_ak4117_spdif_qget,
391},
392{
393	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
394	.name =		"IEC958 Audio",
395	.access =	SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
396	.info =		snd_ak4117_in_bit_info,
397	.get =		snd_ak4117_in_bit_get,
398	.private_value = (1<<31) | (3<<8) | AK4117_REG_RCS0,
399},
400{
401	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
402	.name =		"IEC958 Non-PCM Bitstream",
403	.access =	SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
404	.info =		snd_ak4117_in_bit_info,
405	.get =		snd_ak4117_in_bit_get,
406	.private_value = (5<<8) | AK4117_REG_RCS1,
407},
408{
409	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
410	.name =		"IEC958 DTS Bitstream",
411	.access =	SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
412	.info =		snd_ak4117_in_bit_info,
413	.get =		snd_ak4117_in_bit_get,
414	.private_value = (6<<8) | AK4117_REG_RCS1,
415},
416{
417	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
418	.name =		"AK4117 Input Select",
419	.access =	SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE,
420	.info =		snd_ak4117_rx_info,
421	.get =		snd_ak4117_rx_get,
422	.put =		snd_ak4117_rx_put,
423}
424};
425
426int snd_ak4117_build(struct ak4117 *ak4117, struct snd_pcm_substream *cap_substream)
427{
428	struct snd_kcontrol *kctl;
429	unsigned int idx;
430	int err;
431
432	if (snd_BUG_ON(!cap_substream))
433		return -EINVAL;
434	ak4117->substream = cap_substream;
435	for (idx = 0; idx < AK4117_CONTROLS; idx++) {
436		kctl = snd_ctl_new1(&snd_ak4117_iec958_controls[idx], ak4117);
437		if (kctl == NULL)
438			return -ENOMEM;
439		kctl->id.device = cap_substream->pcm->device;
440		kctl->id.subdevice = cap_substream->number;
441		err = snd_ctl_add(ak4117->card, kctl);
442		if (err < 0)
443			return err;
444		ak4117->kctls[idx] = kctl;
445	}
446	return 0;
447}
448
449int snd_ak4117_external_rate(struct ak4117 *ak4117)
450{
451	unsigned char rcs1;
452
453	rcs1 = reg_read(ak4117, AK4117_REG_RCS1);
454	return external_rate(rcs1);
455}
456
457int snd_ak4117_check_rate_and_errors(struct ak4117 *ak4117, unsigned int flags)
458{
459	struct snd_pcm_runtime *runtime = ak4117->substream ? ak4117->substream->runtime : NULL;
460	unsigned long _flags;
461	int res = 0;
462	unsigned char rcs0, rcs1, rcs2;
463	unsigned char c0, c1;
464
465	rcs1 = reg_read(ak4117, AK4117_REG_RCS1);
466	if (flags & AK4117_CHECK_NO_STAT)
467		goto __rate;
468	rcs0 = reg_read(ak4117, AK4117_REG_RCS0);
469	rcs2 = reg_read(ak4117, AK4117_REG_RCS2);
470	// printk(KERN_DEBUG "AK IRQ: rcs0 = 0x%x, rcs1 = 0x%x, rcs2 = 0x%x\n", rcs0, rcs1, rcs2);
471	spin_lock_irqsave(&ak4117->lock, _flags);
472	if (rcs0 & AK4117_PAR)
473		ak4117->parity_errors++;
474	if (rcs0 & AK4117_V)
475		ak4117->v_bit_errors++;
476	if (rcs2 & AK4117_CCRC)
477		ak4117->ccrc_errors++;
478	if (rcs2 & AK4117_QCRC)
479		ak4117->qcrc_errors++;
480	c0 = (ak4117->rcs0 & (AK4117_QINT | AK4117_CINT | AK4117_STC | AK4117_AUDION | AK4117_AUTO | AK4117_UNLCK)) ^
481                     (rcs0 & (AK4117_QINT | AK4117_CINT | AK4117_STC | AK4117_AUDION | AK4117_AUTO | AK4117_UNLCK));
482	c1 = (ak4117->rcs1 & (AK4117_DTSCD | AK4117_NPCM | AK4117_PEM | 0x0f)) ^
483	             (rcs1 & (AK4117_DTSCD | AK4117_NPCM | AK4117_PEM | 0x0f));
484	ak4117->rcs0 = rcs0 & ~(AK4117_QINT | AK4117_CINT | AK4117_STC);
485	ak4117->rcs1 = rcs1;
486	ak4117->rcs2 = rcs2;
487	spin_unlock_irqrestore(&ak4117->lock, _flags);
488
489	if (rcs0 & AK4117_PAR)
490		snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[0]->id);
491	if (rcs0 & AK4117_V)
492		snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[1]->id);
493	if (rcs2 & AK4117_CCRC)
494		snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[2]->id);
495	if (rcs2 & AK4117_QCRC)
496		snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[3]->id);
497
498	/* rate change */
499	if (c1 & 0x0f)
500		snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[4]->id);
501
502	if ((c1 & AK4117_PEM) | (c0 & AK4117_CINT))
503		snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[6]->id);
504	if (c0 & AK4117_QINT)
505		snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[8]->id);
506
507	if (c0 & AK4117_AUDION)
508		snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[9]->id);
509	if (c1 & AK4117_NPCM)
510		snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[10]->id);
511	if (c1 & AK4117_DTSCD)
512		snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[11]->id);
513
514	if (ak4117->change_callback && (c0 | c1) != 0)
515		ak4117->change_callback(ak4117, c0, c1);
516
517      __rate:
518	/* compare rate */
519	res = external_rate(rcs1);
520	if (!(flags & AK4117_CHECK_NO_RATE) && runtime && runtime->rate != res) {
521		snd_pcm_stream_lock_irqsave(ak4117->substream, _flags);
522		if (snd_pcm_running(ak4117->substream)) {
523			// printk(KERN_DEBUG "rate changed (%i <- %i)\n", runtime->rate, res);
524			snd_pcm_stop(ak4117->substream, SNDRV_PCM_STATE_DRAINING);
525			wake_up(&runtime->sleep);
526			res = 1;
527		}
528		snd_pcm_stream_unlock_irqrestore(ak4117->substream, _flags);
529	}
530	return res;
531}
532
533static void snd_ak4117_timer(unsigned long data)
534{
535	struct ak4117 *chip = (struct ak4117 *)data;
536
537	if (chip->init)
538		return;
539	snd_ak4117_check_rate_and_errors(chip, 0);
540	mod_timer(&chip->timer, 1 + jiffies);
541}
542
543EXPORT_SYMBOL(snd_ak4117_create);
544EXPORT_SYMBOL(snd_ak4117_reg_write);
545EXPORT_SYMBOL(snd_ak4117_reinit);
546EXPORT_SYMBOL(snd_ak4117_build);
547EXPORT_SYMBOL(snd_ak4117_external_rate);
548EXPORT_SYMBOL(snd_ak4117_check_rate_and_errors);
549