1/*
2 **********************************************************************
3 *     recmgr.c -- Recording manager for emu10k1 driver
4 *     Copyright 1999, 2000 Creative Labs, Inc.
5 *
6 **********************************************************************
7 *
8 *     Date                 Author          Summary of changes
9 *     ----                 ------          ------------------
10 *     October 20, 1999     Bertrand Lee    base code release
11 *
12 **********************************************************************
13 *
14 *     This program is free software; you can redistribute it and/or
15 *     modify it under the terms of the GNU General Public License as
16 *     published by the Free Software Foundation; either version 2 of
17 *     the License, or (at your option) any later version.
18 *
19 *     This program is distributed in the hope that it will be useful,
20 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
21 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22 *     GNU General Public License for more details.
23 *
24 *     You should have received a copy of the GNU General Public
25 *     License along with this program; if not, write to the Free
26 *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
27 *     USA.
28 *
29 **********************************************************************
30 */
31
32#include <linux/delay.h>
33#include "8010.h"
34#include "recmgr.h"
35
36void emu10k1_reset_record(struct emu10k1_card *card, struct wavein_buffer *buffer)
37{
38	DPF(2, "emu10k1_reset_record()\n");
39
40	sblive_writeptr(card, buffer->sizereg, 0, ADCBS_BUFSIZE_NONE);
41
42	sblive_writeptr(card, buffer->sizereg, 0, buffer->sizeregval);
43
44	while (sblive_readptr(card, buffer->idxreg, 0))
45		udelay(5);
46}
47
48void emu10k1_start_record(struct emu10k1_card *card, struct wavein_buffer *buffer)
49{
50	DPF(2, "emu10k1_start_record()\n");
51
52	if (buffer->adcctl)
53		sblive_writeptr(card, ADCCR, 0, buffer->adcctl);
54}
55
56void emu10k1_stop_record(struct emu10k1_card *card, struct wavein_buffer *buffer)
57{
58	DPF(2, "emu10k1_stop_record()\n");
59
60	/* Disable record transfer */
61	if (buffer->adcctl)
62		sblive_writeptr(card, ADCCR, 0, 0);
63}
64
65void emu10k1_set_record_src(struct emu10k1_card *card, struct wiinst *wiinst)
66{
67	struct wavein_buffer *buffer = &wiinst->buffer;
68
69	DPF(2, "emu10k1_set_record_src()\n");
70
71	switch (wiinst->recsrc) {
72
73	case WAVERECORD_AC97:
74		DPF(2, "recording source: AC97\n");
75		buffer->sizereg = ADCBS;
76		buffer->addrreg = ADCBA;
77		buffer->idxreg = card->is_audigy ? A_ADCIDX_IDX : ADCIDX_IDX;
78
79		switch (wiinst->format.samplingrate) {
80		case 0xBB80:
81			buffer->adcctl = ADCCR_SAMPLERATE_48;
82			break;
83		case 0xAC44:
84			buffer->adcctl = ADCCR_SAMPLERATE_44;
85			break;
86		case 0x7D00:
87			buffer->adcctl = ADCCR_SAMPLERATE_32;
88			break;
89		case 0x5DC0:
90			buffer->adcctl = ADCCR_SAMPLERATE_24;
91			break;
92		case 0x5622:
93			buffer->adcctl = ADCCR_SAMPLERATE_22;
94			break;
95		case 0x3E80:
96			buffer->adcctl = ADCCR_SAMPLERATE_16;
97			break;
98		/*
99		case ????:
100			buffer->adcctl = A_ADCCR_SAMPLERATE_12;
101			break;
102		*/
103		case 0x2B11:
104			buffer->adcctl = card->is_audigy ? A_ADCCR_SAMPLERATE_11 : ADCCR_SAMPLERATE_11;
105			break;
106		case 0x1F40:
107			buffer->adcctl = card->is_audigy ? A_ADCCR_SAMPLERATE_8 : ADCCR_SAMPLERATE_8;
108			break;
109		default:
110			BUG();
111			break;
112		}
113
114		buffer->adcctl |= card->is_audigy ? A_ADCCR_LCHANENABLE : ADCCR_LCHANENABLE;
115
116		if (wiinst->format.channels == 2)
117			buffer->adcctl |= card->is_audigy ? A_ADCCR_RCHANENABLE : ADCCR_RCHANENABLE;
118
119		break;
120
121	case WAVERECORD_MIC:
122		DPF(2, "recording source: MIC\n");
123		buffer->sizereg = MICBS;
124		buffer->addrreg = MICBA;
125		buffer->idxreg = MICIDX_IDX;
126		buffer->adcctl = 0;
127		break;
128
129	case WAVERECORD_FX:
130		DPF(2, "recording source: FX\n");
131		buffer->sizereg = FXBS;
132		buffer->addrreg = FXBA;
133		buffer->idxreg = FXIDX_IDX;
134		buffer->adcctl = 0;
135
136		sblive_writeptr(card, FXWC, 0, wiinst->fxwc);
137		break;
138	default:
139		BUG();
140		break;
141	}
142
143	DPD(2, "bus addx: %#lx\n", (unsigned long) buffer->dma_handle);
144
145	sblive_writeptr(card, buffer->addrreg, 0, (u32)buffer->dma_handle);
146}
147