saa7134-alsa.c 25.7 KB
Newer Older
1
/*
2
 *   SAA713x ALSA support for V4L
3 4
 *
 *
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 *   Caveats:
 *        - Volume doesn't work (it's always at max)
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, version 2
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
20 21 22 23
 *
 */

#include <sound/driver.h>
24 25 26 27 28 29
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/time.h>
#include <linux/wait.h>
#include <linux/moduleparam.h>
#include <linux/module.h>
30 31
#include <sound/core.h>
#include <sound/control.h>
32 33
#include <sound/pcm.h>
#include <sound/rawmidi.h>
34 35 36 37 38
#include <sound/initval.h>

#include "saa7134.h"
#include "saa7134-reg.h"

39 40 41 42 43 44 45
static unsigned int debug  = 0;
module_param(debug, int, 0644);
MODULE_PARM_DESC(debug,"enable debug messages [alsa]");

unsigned int dsp_nr = 0;
module_param(dsp_nr,   int, 0444);
MODULE_PARM_DESC(dsp_nr,   "alsa device number");
46

47 48 49 50
/*
 * Configuration macros
 */

51 52 53 54 55 56 57 58 59 60 61 62 63 64
/* defaults */
#define MAX_BUFFER_SIZE		(256*1024)
#define USE_FORMATS 		SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE | SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_U16_LE | SNDRV_PCM_FMTBIT_U16_BE
#define USE_RATE		SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000
#define USE_RATE_MIN		32000
#define USE_RATE_MAX		48000
#define USE_CHANNELS_MIN 	1
#define USE_CHANNELS_MAX 	2
#ifndef USE_PERIODS_MIN
#define USE_PERIODS_MIN 	2
#endif
#ifndef USE_PERIODS_MAX
#define USE_PERIODS_MAX 	1024
#endif
65

66 67 68 69
#define MIXER_ADDR_TVTUNER	0
#define MIXER_ADDR_LINE1	1
#define MIXER_ADDR_LINE2	2
#define MIXER_ADDR_LAST		2
70

71 72 73 74
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};

75
#define dprintk(fmt, arg...)    if (debug) \
76
        printk(KERN_DEBUG "%s/alsa: " fmt, dev->name , ## arg)
77

78 79 80
/*
 * Main chip structure
 */
81 82 83 84 85
typedef struct snd_card_saa7134 {
	snd_card_t *card;
	spinlock_t mixer_lock;
	int mixer_volume[MIXER_ADDR_LAST+1][2];
	int capture_source[MIXER_ADDR_LAST+1][2];
86 87
	struct pci_dev *pci;
	struct saa7134_dev *saadev;
88

89 90
	unsigned long iobase;
	int irq;
91 92 93 94

	spinlock_t lock;
} snd_card_saa7134_t;

95 96


97 98 99 100
/*
 * PCM structure
 */

101
typedef struct snd_card_saa7134_pcm {
102
	struct saa7134_dev *saadev;
103 104 105 106 107 108 109

	spinlock_t lock;
	unsigned int pcm_size;		/* buffer size */
	unsigned int pcm_count;		/* bytes per period */
	unsigned int pcm_bps;		/* bytes per second */
	snd_pcm_substream_t *substream;
} snd_card_saa7134_pcm_t;
110

111
static snd_card_t *snd_saa7134_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
112

113

114 115 116 117 118 119 120 121 122 123
/*
 * saa7134 DMA audio stop
 *
 *   Called when the capture device is released or the buffer overflows
 *
 *   - Copied verbatim from saa7134-oss's dsp_dma_stop. Can be dropped
 *     if we just share dsp_dma_stop and use it here
 *
 */

124
static void saa7134_dma_stop(struct saa7134_dev *dev)
125

126
{
127 128 129
	dev->oss.dma_blk     = -1;
	dev->oss.dma_running = 0;
	saa7134_set_dmabits(dev);
130
}
131

132 133 134 135 136 137 138 139 140 141
/*
 * saa7134 DMA audio start
 *
 *   Called when preparing the capture device for use
 *
 *   - Copied verbatim from saa7134-oss's dsp_dma_start. Can be dropped
 *     if we just share dsp_dma_start and use it here
 *
 */

142 143
static void saa7134_dma_start(struct saa7134_dev *dev)
{
144 145 146
	dev->oss.dma_blk     = 0;
	dev->oss.dma_running = 1;
	saa7134_set_dmabits(dev);
147
}
148

149 150 151 152 153 154 155 156 157 158 159
/*
 * saa7134 audio DMA IRQ handler
 *
 *   Called whenever we get an SAA7134_IRQ_REPORT_DONE_RA3 interrupt
 *   Handles shifting between the 2 buffers, manages the read counters,
 *  and notifies ALSA when periods elapse
 *
 *   - Mostly copied from saa7134-oss's saa7134_irq_oss_done.
 *
 */

160 161 162
void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status)
{
	int next_blk, reg = 0;
163

164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
	spin_lock(&dev->slock);
	if (UNSET == dev->oss.dma_blk) {
		dprintk("irq: recording stopped\n");
		goto done;
	}
	if (0 != (status & 0x0f000000))
		dprintk("irq: lost %ld\n", (status >> 24) & 0x0f);
	if (0 == (status & 0x10000000)) {
		/* odd */
		if (0 == (dev->oss.dma_blk & 0x01))
			reg = SAA7134_RS_BA1(6);
	} else {
		/* even */
		if (1 == (dev->oss.dma_blk & 0x01))
			reg = SAA7134_RS_BA2(6);
	}
	if (0 == reg) {
		dprintk("irq: field oops [%s]\n",
			(status & 0x10000000) ? "even" : "odd");
		goto done;
	}
185

186 187 188 189 190 191
	if (dev->oss.read_count >= dev->oss.blksize * (dev->oss.blocks-2)) {
		dprintk("irq: overrun [full=%d/%d] - Blocks in %d\n",dev->oss.read_count,
			dev->oss.bufsize, dev->oss.blocks);
		saa7134_dma_stop(dev);
		goto done;
	}
192

193 194 195
	/* next block addr */
	next_blk = (dev->oss.dma_blk + 2) % dev->oss.blocks;
	saa_writel(reg,next_blk * dev->oss.blksize);
196
	if (debug > 2)
197 198 199
		dprintk("irq: ok, %s, next_blk=%d, addr=%x, blocks=%u, size=%u, read=%u\n",
			(status & 0x10000000) ? "even" : "odd ", next_blk,
			next_blk * dev->oss.blksize, dev->oss.blocks, dev->oss.blksize, dev->oss.read_count);
200

201 202 203
	/* update status & wake waiting readers */
	dev->oss.dma_blk = (dev->oss.dma_blk + 1) % dev->oss.blocks;
	dev->oss.read_count += dev->oss.blksize;
204

205
	dev->oss.recording_on = reg;
206

207
	if (dev->oss.read_count >= snd_pcm_lib_period_bytes(dev->oss.substream)) {
208 209 210
		spin_unlock(&dev->slock);
		snd_pcm_period_elapsed(dev->oss.substream);
		spin_lock(&dev->slock);
211 212
	}
 done:
213
	spin_unlock(&dev->slock);
214

215
}
216

217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
/*
 * IRQ request handler
 *
 *   Runs along with saa7134's IRQ handler, discards anything that isn't
 *   DMA sound
 *
 */

static irqreturn_t saa7134_alsa_irq(int irq, void *dev_id, struct pt_regs *regs)
{
	struct saa7134_dev *dev = (struct saa7134_dev*) dev_id;
	unsigned long report, status;
	int loop, handled = 0;

	for (loop = 0; loop < 10; loop++) {
		report = saa_readl(SAA7134_IRQ_REPORT);
		status = saa_readl(SAA7134_IRQ_STATUS);

		if (report & SAA7134_IRQ_REPORT_DONE_RA3) {
			handled = 1;
			saa_writel(SAA7134_IRQ_REPORT,report);
			saa7134_irq_alsa_done(dev, status);
		} else {
			goto out;
		}
	}

	if (loop == 10) {
		dprintk("error! looping IRQ!");
	}

out:
	return IRQ_RETVAL(handled);
}

252 253 254 255 256 257 258 259 260
/*
 * ALSA capture trigger
 *
 *   - One of the ALSA capture callbacks.
 *
 *   Called whenever a capture is started or stopped. Must be defined,
 *   but there's nothing we want to do here
 *
 */
261

262 263
static int snd_card_saa7134_capture_trigger(snd_pcm_substream_t * substream,
					  int cmd)
264 265 266 267
{
	return 0;
}

268 269 270 271 272 273 274 275 276 277 278 279
/*
 * DMA buffer config
 *
 *   Sets the values that will later be used as the size of the buffer,
 *  size of the fragments, and total number of fragments.
 *   Must be called during the preparation stage, before memory is
 *  allocated
 *
 *   - Copied verbatim from saa7134-oss. Can be dropped
 *     if we just share dsp_buffer_conf from OSS.
 */

280
static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks)
281
{
282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
	if (blksize < 0x100)
		blksize = 0x100;
	if (blksize > 0x10000)
		blksize = 0x10000;

	if (blocks < 2)
		blocks = 2;
	if ((blksize * blocks) > 1024*1024)
		blocks = 1024*1024 / blksize;

	dev->oss.blocks  = blocks;
	dev->oss.blksize = blksize;
	dev->oss.bufsize = blksize * blocks;

	dprintk("buffer config: %d blocks / %d bytes, %d kB total\n",
		blocks,blksize,blksize * blocks / 1024);
	return 0;
299 300
}

301 302 303 304 305 306 307 308 309 310 311
/*
 * DMA buffer initialization
 *
 *   Uses V4L functions to initialize the DMA. Shouldn't be necessary in
 *  ALSA, but I was unable to use ALSA's own DMA, and had to force the
 *  usage of V4L's
 *
 *   - Copied verbatim from saa7134-oss. Can be dropped
 *     if we just share dsp_buffer_init from OSS.
 */

312
static int dsp_buffer_init(struct saa7134_dev *dev)
313
{
314 315 316 317 318 319
	int err;

	if (!dev->oss.bufsize)
		BUG();
	videobuf_dma_init(&dev->oss.dma);
	err = videobuf_dma_init_kernel(&dev->oss.dma, PCI_DMA_FROMDEVICE,
320
				       (dev->oss.bufsize + PAGE_SIZE) >> PAGE_SHIFT);
321 322 323
	if (0 != err)
		return err;
	return 0;
324 325
}

326 327 328 329 330 331 332 333 334 335 336
/*
 * ALSA PCM preparation
 *
 *   - One of the ALSA capture callbacks.
 *
 *   Called right after the capture device is opened, this function configures
 *  the buffer using the previously defined functions, allocates the memory,
 *  sets up the hardware registers, and then starts the DMA. When this function
 *  returns, the audio should be flowing.
 *
 */
337

338
static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
339
{
340
	snd_pcm_runtime_t *runtime = substream->runtime;
341 342 343
	int err, bswap, sign;
	u32 fmt, control;
	unsigned long flags;
344
	snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
345
	struct saa7134_dev *dev;
346 347
	snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
	unsigned int bps;
348 349
	unsigned long size;
	unsigned count;
350

351 352
	size = snd_pcm_lib_buffer_bytes(substream);
	count = snd_pcm_lib_period_bytes(substream);
353 354 355 356 357 358 359 360 361 362 363 364 365 366

	saapcm->saadev->oss.substream = substream;
	bps = runtime->rate * runtime->channels;
	bps *= snd_pcm_format_width(runtime->format);
	bps /= 8;
	if (bps <= 0)
		return -EINVAL;
	saapcm->pcm_bps = bps;
	saapcm->pcm_size = snd_pcm_lib_buffer_bytes(substream);
	saapcm->pcm_count = snd_pcm_lib_period_bytes(substream);


	dev=saa7134->saadev;

367
	dsp_buffer_conf(dev,saapcm->pcm_count,(saapcm->pcm_size/saapcm->pcm_count));
368

369 370 371
	err = dsp_buffer_init(dev);
	if (0 != err)
		goto fail2;
372

373 374 375 376 377 378
	/* prepare buffer */
	if (0 != (err = videobuf_dma_pci_map(dev->pci,&dev->oss.dma)))
		return err;
	if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->oss.pt)))
		goto fail1;
	if (0 != (err = saa7134_pgtable_build(dev->pci,&dev->oss.pt,
379 380 381
					      dev->oss.dma.sglist,
					      dev->oss.dma.sglen,
					      0)))
382
		goto fail2;
383 384 385



386 387 388
	switch (runtime->format) {
	  case SNDRV_PCM_FORMAT_U8:
	  case SNDRV_PCM_FORMAT_S8:
389 390
		fmt = 0x00;
		break;
391 392 393 394
	  case SNDRV_PCM_FORMAT_U16_LE:
	  case SNDRV_PCM_FORMAT_U16_BE:
	  case SNDRV_PCM_FORMAT_S16_LE:
	  case SNDRV_PCM_FORMAT_S16_BE:
395 396
		fmt = 0x01;
		break;
397 398 399 400 401 402 403 404 405
	  default:
		err = -EINVAL;
		return 1;
	}

	switch (runtime->format) {
	  case SNDRV_PCM_FORMAT_S8:
	  case SNDRV_PCM_FORMAT_S16_LE:
	  case SNDRV_PCM_FORMAT_S16_BE:
406 407
		sign = 1;
		break;
408
	  default:
409 410
		sign = 0;
		break;
411
	}
412

413 414 415
	switch (runtime->format) {
	  case SNDRV_PCM_FORMAT_U16_BE:
	  case SNDRV_PCM_FORMAT_S16_BE:
416
		bswap = 1; break;
417
	  default:
418
		bswap = 0; break;
419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
	}

	switch (dev->pci->device) {
	  case PCI_DEVICE_ID_PHILIPS_SAA7134:
		if (1 == runtime->channels)
			fmt |= (1 << 3);
		if (2 == runtime->channels)
			fmt |= (3 << 3);
		if (sign)
			fmt |= 0x04;

		fmt |= (MIXER_ADDR_TVTUNER == dev->oss.input) ? 0xc0 : 0x80;
		saa_writeb(SAA7134_NUM_SAMPLES0, ((dev->oss.blksize - 1) & 0x0000ff));
		saa_writeb(SAA7134_NUM_SAMPLES1, ((dev->oss.blksize - 1) & 0x00ff00) >>  8);
		saa_writeb(SAA7134_NUM_SAMPLES2, ((dev->oss.blksize - 1) & 0xff0000) >> 16);
		saa_writeb(SAA7134_AUDIO_FORMAT_CTRL, fmt);

		break;
	  case PCI_DEVICE_ID_PHILIPS_SAA7133:
	  case PCI_DEVICE_ID_PHILIPS_SAA7135:
		if (1 == runtime->channels)
			fmt |= (1 << 4);
		if (2 == runtime->channels)
			fmt |= (2 << 4);
		if (!sign)
			fmt |= 0x04;
		saa_writel(SAA7133_NUM_SAMPLES, dev->oss.blksize -1);
		saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210 | (fmt << 24));
		//saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210);
		break;
	}

	dprintk("rec_start: afmt=%d ch=%d  =>  fmt=0x%x swap=%c\n",
		runtime->format, runtime->channels, fmt,
		bswap ? 'b' : '-');
	/* dma: setup channel 6 (= AUDIO) */
	control = SAA7134_RS_CONTROL_BURST_16 |
		SAA7134_RS_CONTROL_ME |
		(dev->oss.pt.dma >> 12);
	if (bswap)
		control |= SAA7134_RS_CONTROL_BSWAP;
460

461
	/* I should be able to use runtime->dma_addr in the control
462 463
	   byte, but it doesn't work. So I allocate the DMA using the
	   V4L functions, and force ALSA to use that as the DMA area */
464

465
	runtime->dma_area = dev->oss.dma.vmalloc;
466

467 468 469 470
	saa_writel(SAA7134_RS_BA1(6),0);
	saa_writel(SAA7134_RS_BA2(6),dev->oss.blksize);
	saa_writel(SAA7134_RS_PITCH(6),0);
	saa_writel(SAA7134_RS_CONTROL(6),control);
471 472

	dev->oss.rate = runtime->rate;
473 474 475 476
	/* start dma */
	spin_lock_irqsave(&dev->slock,flags);
	saa7134_dma_start(dev);
	spin_unlock_irqrestore(&dev->slock,flags);
477

478 479
	return 0;
 fail2:
480
	saa7134_pgtable_free(dev->pci,&dev->oss.pt);
481
 fail1:
482 483
	videobuf_dma_pci_unmap(dev->pci,&dev->oss.dma);
	return err;
484 485


486
}
487

488 489 490 491 492 493 494 495 496 497
/*
 * ALSA pointer fetching
 *
 *   - One of the ALSA capture callbacks.
 *
 *   Called whenever a period elapses, it must return the current hardware
 *  position of the buffer.
 *   Also resets the read counter used to prevent overruns
 *
 */
498

499
static snd_pcm_uframes_t snd_card_saa7134_capture_pointer(snd_pcm_substream_t * substream)
500 501
{
	snd_pcm_runtime_t *runtime = substream->runtime;
502 503
	snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
	struct saa7134_dev *dev=saapcm->saadev;
504 505 506



507
	if (dev->oss.read_count) {
508 509 510 511
		dev->oss.read_count  -= snd_pcm_lib_period_bytes(substream);
		dev->oss.read_offset += snd_pcm_lib_period_bytes(substream);
		if (dev->oss.read_offset == dev->oss.bufsize)
			dev->oss.read_offset = 0;
512
	}
513

514 515
	return bytes_to_frames(runtime, dev->oss.read_offset);
}
516

517 518 519
/*
 * ALSA hardware capabilities definition
 */
520

521
static snd_pcm_hardware_t snd_card_saa7134_capture =
522
{
523
	.info =                 (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
524 525
				 SNDRV_PCM_INFO_BLOCK_TRANSFER |
				 SNDRV_PCM_INFO_MMAP_VALID),
526 527 528 529 530 531 532 533 534 535 536 537 538
	.formats =		USE_FORMATS,
	.rates =		USE_RATE,
	.rate_min =		USE_RATE_MIN,
	.rate_max =		USE_RATE_MAX,
	.channels_min =		USE_CHANNELS_MIN,
	.channels_max =		USE_CHANNELS_MAX,
	.buffer_bytes_max =	MAX_BUFFER_SIZE,
	.period_bytes_min =	64,
	.period_bytes_max =	MAX_BUFFER_SIZE,
	.periods_min =		USE_PERIODS_MIN,
	.periods_max =		USE_PERIODS_MAX,
	.fifo_size =		0x08070503,
};
539

540 541 542 543 544
static void snd_card_saa7134_runtime_free(snd_pcm_runtime_t *runtime)
{
	snd_card_saa7134_pcm_t *saapcm = runtime->private_data;

	kfree(saapcm);
545 546
}

547

548 549 550 551 552 553 554
/*
 * ALSA hardware params
 *
 *   - One of the ALSA capture callbacks.
 *
 *   Called on initialization, right before the PCM preparation
 *   Usually used in ALSA to allocate the DMA, but since we don't use the
555
 *  ALSA DMA it does nothing
556 557 558
 *
 */

559 560
static int snd_card_saa7134_hw_params(snd_pcm_substream_t * substream,
				    snd_pcm_hw_params_t * hw_params)
561
{
562

563
	return 0;
564 565


566 567
}

568 569 570 571 572 573 574 575 576 577 578
/*
 * ALSA hardware release
 *
 *   - One of the ALSA capture callbacks.
 *
 *   Called after closing the device, but before snd_card_saa7134_capture_close
 *   Usually used in ALSA to free the DMA, but since we don't use the
 *  ALSA DMA I'm almost sure this isn't necessary.
 *
 */

579
static int snd_card_saa7134_hw_free(snd_pcm_substream_t * substream)
580
{
581
	return 0;
582 583
}

584 585 586 587 588 589 590
/*
 * DMA buffer release
 *
 *   Called after closing the device, during snd_card_saa7134_capture_close
 *
 */

591
static int dsp_buffer_free(struct saa7134_dev *dev)
592
{
593 594
	if (!dev->oss.blksize)
		BUG();
595

596
	videobuf_dma_free(&dev->oss.dma);
597

598 599 600
	dev->oss.blocks  = 0;
	dev->oss.blksize = 0;
	dev->oss.bufsize = 0;
601

602
	return 0;
603 604
}

605 606 607 608 609 610 611 612 613
/*
 * ALSA capture finish
 *
 *   - One of the ALSA capture callbacks.
 *
 *   Called after closing the device. It stops the DMA audio and releases
 *  the buffers
 *
 */
614

615
static int snd_card_saa7134_capture_close(snd_pcm_substream_t * substream)
616
{
617
	snd_card_saa7134_t *chip = snd_pcm_substream_chip(substream);
618
	struct saa7134_dev *dev = chip->saadev;
619
	unsigned long flags;
620

621 622 623 624
	/* stop dma */
	spin_lock_irqsave(&dev->slock,flags);
	saa7134_dma_stop(dev);
	spin_unlock_irqrestore(&dev->slock,flags);
625

626 627 628
	/* unlock buffer */
	saa7134_pgtable_free(dev->pci,&dev->oss.pt);
	videobuf_dma_pci_unmap(dev->pci,&dev->oss.dma);
629

630 631
	dsp_buffer_free(dev);
	return 0;
632 633
}

634 635 636 637 638 639 640 641 642
/*
 * ALSA capture start
 *
 *   - One of the ALSA capture callbacks.
 *
 *   Called when opening the device. It creates and populates the PCM
 *  structure
 *
 */
643

644 645 646 647
static int snd_card_saa7134_capture_open(snd_pcm_substream_t * substream)
{
	snd_pcm_runtime_t *runtime = substream->runtime;
	snd_card_saa7134_pcm_t *saapcm;
648 649
	snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
	struct saa7134_dev *dev = saa7134->saadev;
650
	int err;
651

652
	down(&dev->oss.lock);
653

654 655 656 657
	dev->oss.afmt        = SNDRV_PCM_FORMAT_U8;
	dev->oss.channels    = 2;
	dev->oss.read_count  = 0;
	dev->oss.read_offset = 0;
658

659
	up(&dev->oss.lock);
660

661 662 663 664 665 666 667 668 669 670 671 672
	saapcm = kcalloc(1, sizeof(*saapcm), GFP_KERNEL);
	if (saapcm == NULL)
		return -ENOMEM;
	saapcm->saadev=saa7134->saadev;

	spin_lock_init(&saapcm->lock);

	saapcm->substream = substream;
	runtime->private_data = saapcm;
	runtime->private_free = snd_card_saa7134_runtime_free;
	runtime->hw = snd_card_saa7134_capture;

673 674
	if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
		return err;
675 676 677 678

	return 0;
}

679 680 681
/*
 * ALSA capture callbacks definition
 */
682

683 684 685 686 687 688 689 690 691
static snd_pcm_ops_t snd_card_saa7134_capture_ops = {
	.open =			snd_card_saa7134_capture_open,
	.close =		snd_card_saa7134_capture_close,
	.ioctl =		snd_pcm_lib_ioctl,
	.hw_params =		snd_card_saa7134_hw_params,
	.hw_free =		snd_card_saa7134_hw_free,
	.prepare =		snd_card_saa7134_capture_prepare,
	.trigger =		snd_card_saa7134_capture_trigger,
	.pointer =		snd_card_saa7134_capture_pointer,
692 693
};

694 695 696 697 698 699 700 701 702
/*
 * ALSA PCM setup
 *
 *   Called when initializing the board. Sets up the name and hooks up
 *  the callbacks
 *
 */

static int snd_card_saa7134_pcm(snd_card_saa7134_t *saa7134, int device)
703 704 705
{
	snd_pcm_t *pcm;
	int err;
706

707 708 709 710 711 712 713 714
	if ((err = snd_pcm_new(saa7134->card, "SAA7134 PCM", device, 0, 1, &pcm)) < 0)
		return err;
	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_card_saa7134_capture_ops);
	pcm->private_data = saa7134;
	pcm->info_flags = 0;
	strcpy(pcm->name, "SAA7134 PCM");
	return 0;
}
715

716 717 718 719 720
#define SAA713x_VOLUME(xname, xindex, addr) \
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
  .info = snd_saa7134_volume_info, \
  .get = snd_saa7134_volume_get, .put = snd_saa7134_volume_put, \
  .private_value = addr }
721

722 723 724 725 726 727 728 729
static int snd_saa7134_volume_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t * uinfo)
{
	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
	uinfo->count = 2;
	uinfo->value.integer.min = 0;
	uinfo->value.integer.max = 20;
	return 0;
}
730

731 732 733 734 735 736 737 738 739 740 741 742
static int snd_saa7134_volume_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
{
	snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
	unsigned long flags;
	int addr = kcontrol->private_value;

	spin_lock_irqsave(&chip->mixer_lock, flags);
	ucontrol->value.integer.value[0] = chip->mixer_volume[addr][0];
	ucontrol->value.integer.value[1] = chip->mixer_volume[addr][1];
	spin_unlock_irqrestore(&chip->mixer_lock, flags);
	return 0;
}
743

744
static int snd_saa7134_volume_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
745
{
746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762
	snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
	unsigned long flags;
	int change, addr = kcontrol->private_value;
	int left, right;

	left = ucontrol->value.integer.value[0];
	if (left < 0)
		left = 0;
	if (left > 20)
		left = 20;
	right = ucontrol->value.integer.value[1];
	if (right < 0)
		right = 0;
	if (right > 20)
		right = 20;
	spin_lock_irqsave(&chip->mixer_lock, flags);
	change = chip->mixer_volume[addr][0] != left ||
763
		 chip->mixer_volume[addr][1] != right;
764 765 766 767 768
	chip->mixer_volume[addr][0] = left;
	chip->mixer_volume[addr][1] = right;
	spin_unlock_irqrestore(&chip->mixer_lock, flags);
	return change;
}
769

770 771 772 773 774
#define SAA713x_CAPSRC(xname, xindex, addr) \
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
  .info = snd_saa7134_capsrc_info, \
  .get = snd_saa7134_capsrc_get, .put = snd_saa7134_capsrc_put, \
  .private_value = addr }
775

776 777 778
static int snd_saa7134_capsrc_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t * uinfo)
{
	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
779
	uinfo->count = 2;
780 781 782 783
	uinfo->value.integer.min = 0;
	uinfo->value.integer.max = 1;
	return 0;
}
784

785 786 787 788 789 790 791 792 793 794
static int snd_saa7134_capsrc_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
{
	snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
	unsigned long flags;
	int addr = kcontrol->private_value;

	spin_lock_irqsave(&chip->mixer_lock, flags);
	ucontrol->value.integer.value[0] = chip->capture_source[addr][0];
	ucontrol->value.integer.value[1] = chip->capture_source[addr][1];
	spin_unlock_irqrestore(&chip->mixer_lock, flags);
795 796 797
	return 0;
}

798
static int snd_saa7134_capsrc_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
799
{
800 801 802 803
	snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
	unsigned long flags;
	int change, addr = kcontrol->private_value;
	int left, right;
804
	u32 anabar, xbarin;
805 806 807 808 809 810 811 812 813
	int analog_io, rate;
	struct saa7134_dev *dev;

	dev = chip->saadev;

	left = ucontrol->value.integer.value[0] & 1;
	right = ucontrol->value.integer.value[1] & 1;
	spin_lock_irqsave(&chip->mixer_lock, flags);

814
	change = chip->capture_source[addr][0] != left ||
815
		 chip->capture_source[addr][1] != right;
816 817 818 819 820 821
	chip->capture_source[addr][0] = left;
	chip->capture_source[addr][1] = right;
	dev->oss.input=addr;
	spin_unlock_irqrestore(&chip->mixer_lock, flags);


822
	if (change) {
823
	  switch (dev->pci->device) {
824 825

	   case PCI_DEVICE_ID_PHILIPS_SAA7134:
826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841
		switch (addr) {
			case MIXER_ADDR_TVTUNER:
				saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0xc0);
				saa_andorb(SAA7134_SIF_SAMPLE_FREQ,   0x03, 0x00);
				break;
			case MIXER_ADDR_LINE1:
			case MIXER_ADDR_LINE2:
				analog_io = (MIXER_ADDR_LINE1 == addr) ? 0x00 : 0x08;
				rate = (32000 == dev->oss.rate) ? 0x01 : 0x03;
				saa_andorb(SAA7134_ANALOG_IO_SELECT,  0x08, analog_io);
				saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0x80);
				saa_andorb(SAA7134_SIF_SAMPLE_FREQ,   0x03, rate);
				break;
		}

		break;
842 843
	   case PCI_DEVICE_ID_PHILIPS_SAA7133:
	   case PCI_DEVICE_ID_PHILIPS_SAA7135:
844
		xbarin = 0x03; // adc
845
		anabar = 0;
846 847 848 849 850 851 852 853 854 855 856 857
		switch (addr) {
			case MIXER_ADDR_TVTUNER:
				xbarin = 0; // Demodulator
				anabar = 2; // DACs
				break;
			case MIXER_ADDR_LINE1:
				anabar = 0;  // aux1, aux1
				break;
			case MIXER_ADDR_LINE2:
				anabar = 9;  // aux2, aux2
				break;
		}
858 859

	    	/* output xbar always main channel */
860
		saa_dsp_writel(dev, SAA7133_DIGITAL_OUTPUT_SEL1, 0xbbbb10);
861 862

		if (left || right) { // We've got data, turn the input on
863 864
		  saa_dsp_writel(dev, SAA7133_DIGITAL_INPUT_XBAR1, xbarin);
		  saa_writel(SAA7133_ANALOG_IO_SELECT, anabar);
865
		} else {
866 867
		  saa_dsp_writel(dev, SAA7133_DIGITAL_INPUT_XBAR1, 0);
		  saa_writel(SAA7133_ANALOG_IO_SELECT, 0);
868
		}
869
		break;
870
	  }
871
	}
872 873

	return change;
874 875
}

876 877 878 879 880 881 882 883
static snd_kcontrol_new_t snd_saa7134_controls[] = {
SAA713x_VOLUME("Video Volume", 0, MIXER_ADDR_TVTUNER),
SAA713x_CAPSRC("Video Capture Switch", 0, MIXER_ADDR_TVTUNER),
SAA713x_VOLUME("Line Volume", 1, MIXER_ADDR_LINE1),
SAA713x_CAPSRC("Line Capture Switch", 1, MIXER_ADDR_LINE1),
SAA713x_VOLUME("Line Volume", 2, MIXER_ADDR_LINE2),
SAA713x_CAPSRC("Line Capture Switch", 2, MIXER_ADDR_LINE2),
};
884

885 886 887 888 889 890 891 892 893
/*
 * ALSA mixer setup
 *
 *   Called when initializing the board. Sets up the name and hooks up
 *  the callbacks
 *
 */

static int snd_card_saa7134_new_mixer(snd_card_saa7134_t * chip)
894 895 896 897 898 899 900
{
	snd_card_t *card = chip->card;
	unsigned int idx;
	int err;

	snd_assert(chip != NULL, return -EINVAL);
	strcpy(card->mixername, "SAA7134 Mixer");
901

902 903 904 905 906 907 908 909
	for (idx = 0; idx < ARRAY_SIZE(snd_saa7134_controls); idx++) {
		if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_saa7134_controls[idx], chip))) < 0)
			return err;
	}
	return 0;
}

static int snd_saa7134_free(snd_card_saa7134_t *chip)
910 911 912 913
{
	return 0;
}

914
static int snd_saa7134_dev_free(snd_device_t *device)
915
{
916 917
	snd_card_saa7134_t *chip = device->device_data;
	return snd_saa7134_free(chip);
918
}
919

920 921 922 923 924 925 926 927
/*
 * ALSA initialization
 *
 *   Called by saa7134-core, it creates the basic structures and registers
 *  the ALSA devices
 *
 */

928
int alsa_card_saa7134_create (struct saa7134_dev *saadev, unsigned int devicenum)
929 930
{
	static int dev;
931

932
	snd_card_t *card;
933
	snd_card_saa7134_t *chip;
934
	int err;
935 936 937
	static snd_device_ops_t ops = {
		.dev_free =     snd_saa7134_dev_free,
	};
938

939

940 941
	if (dev >= SNDRV_CARDS)
		return -ENODEV;
942 943
	if (!enable[dev])
		return -ENODEV;
944

945 946
	if (devicenum) {
		card = snd_card_new(devicenum, id[dev], THIS_MODULE, 0);
947
		dsp_nr++;
948 949 950
	} else {
		card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
	}
951 952
	if (card == NULL)
		return -ENOMEM;
953

954
	strcpy(card->driver, "SAA7134");
955

956
	/* Card "creation" */
957

958
	chip = kcalloc(1, sizeof(*chip), GFP_KERNEL);
959 960 961
	if (chip == NULL) {
		return -ENOMEM;
	}
962

963
	spin_lock_init(&chip->lock);
964

965
	chip->saadev = saadev;
966

967
	chip->card = card;
968

969 970 971
	chip->pci = saadev->pci;
	chip->irq = saadev->pci->irq;
	chip->iobase = pci_resource_start(saadev->pci, 0);
972

973 974 975 976 977 978 979 980 981
	err = request_irq(chip->pci->irq, saa7134_alsa_irq,
				SA_SHIRQ | SA_INTERRUPT, saadev->name, saadev);

	if (err < 0) {
		printk(KERN_ERR "%s: can't get IRQ %d for ALSA\n",
			saadev->name, saadev->pci->irq);
		return err;
	}

982 983 984 985
	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
		snd_saa7134_free(chip);
		return err;
	}
986

987 988
	if ((err = snd_card_saa7134_new_mixer(chip)) < 0)
		goto __nodev;
989

990 991
	if ((err = snd_card_saa7134_pcm(chip, 0)) < 0)
		goto __nodev;
992

993
	spin_lock_init(&chip->mixer_lock);
994

995
	snd_card_set_dev(card, &chip->pci->dev);
996

997
	/* End of "creation" */
998

999
	strcpy(card->shortname, "SAA7134");
1000 1001
	sprintf(card->longname, "%s at 0x%lx irq %d",
		chip->saadev->name, chip->iobase, chip->irq);
1002

1003 1004 1005 1006 1007 1008 1009 1010 1011
	if ((err = snd_card_register(card)) == 0) {
		snd_saa7134_cards[dev] = card;
		return 0;
	}

__nodev:
	snd_card_free(card);
	kfree(card);
	return err;
1012 1013
}

1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045
/*
 * Module initializer
 *
 * Loops through present saa7134 cards, and assigns an ALSA device
 * to each one
 *
 */

static int saa7134_alsa_init(void)
{
        struct saa7134_dev *saadev = NULL;
        struct list_head *list;

	printk(KERN_INFO "saa7134 ALSA driver for DMA sound loaded\n");

        list_for_each(list,&saa7134_devlist) {
                saadev = list_entry(list, struct saa7134_dev, devlist);
		alsa_card_saa7134_create(saadev,dsp_nr);
        }

	if (saadev == NULL)
		printk(KERN_INFO "saa7134 ALSA: no saa7134 cards found\n");

	return 0;

}

/*
 * Module destructor
 */

void saa7134_alsa_exit(void)
1046
{
1047
	int idx;
1048
	for (idx = 0; idx < SNDRV_CARDS; idx++) {
1049
		snd_card_free(snd_saa7134_cards[idx]);
1050
	}
1051 1052
	printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n");
	return;
1053
}
1054 1055 1056 1057 1058

module_init(saa7134_alsa_init);
module_exit(saa7134_alsa_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Ricardo Cerqueira");