Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4ede028f authored by Hans-Christian Egtvedt's avatar Hans-Christian Egtvedt Committed by Takashi Iwai
Browse files

ALSA: Add ALSA driver for Atmel AC97 controller



This patch adds ALSA support for the AC97 controller found on Atmel
AVR32 devices.

Tested on ATSTK1006 + ATSTK1000 with a development board with a AC97
codec.

Signed-off-by: default avatarHans-Christian Egtvedt <hans-christian.egtvedt@atmel.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent e4967d60
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
/*
 * Driver for the Atmel AC97C controller
 *
 * Copyright (C) 2005-2009 Atmel Corporation
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published
 * by the Free Software Foundation.
 */
#ifndef __INCLUDE_SOUND_ATMEL_AC97C_H
#define __INCLUDE_SOUND_ATMEL_AC97C_H

#include <linux/dw_dmac.h>

#define AC97C_CAPTURE	0x01
#define AC97C_PLAYBACK	0x02
#define AC97C_BOTH	(AC97C_CAPTURE | AC97C_PLAYBACK)

/**
 * struct atmel_ac97c_pdata - board specific AC97C configuration
 * @rx_dws: DMA slave interface to use for sound capture.
 * @tx_dws: DMA slave interface to use for sound playback.
 * @reset_pin: GPIO pin wired to the reset input on the external AC97 codec,
 *             optional to use, set to -ENODEV if not in use. AC97 layer will
 *             try to do a software reset of the external codec anyway.
 * @flags: Flags for which directions should be enabled.
 *
 * If the user do not want to use a DMA channel for playback or capture, i.e.
 * only one feature is required on the board. The slave for playback or capture
 * can be set to NULL. The AC97C driver will take use of this when setting up
 * the sound streams.
 */
struct ac97c_platform_data {
	struct dw_dma_slave	rx_dws;
	struct dw_dma_slave	tx_dws;
	unsigned int 		flags;
	int			reset_pin;
};

#endif /* __INCLUDE_SOUND_ATMEL_AC97C_H */
+8 −0
Original line number Diff line number Diff line
@@ -8,4 +8,12 @@ config SND_ATMEL_ABDAC
	help
	  ALSA sound driver for the Atmel Audio Bitstream DAC (ABDAC).

config SND_ATMEL_AC97C
	tristate "Atmel AC97 Controller (AC97C) driver"
	select SND_PCM
	select SND_AC97_CODEC
	depends on DW_DMAC && AVR32
	help
	  ALSA sound driver for the Atmel AC97 controller.

endmenu
+2 −0
Original line number Diff line number Diff line
snd-atmel-abdac-objs		:= abdac.o
snd-atmel-ac97c-objs		:= ac97c.o

obj-$(CONFIG_SND_ATMEL_ABDAC)	+= snd-atmel-abdac.o
obj-$(CONFIG_SND_ATMEL_AC97C)	+= snd-atmel-ac97c.o

sound/atmel/ac97c.c

0 → 100644
+932 −0

File added.

Preview size limit exceeded, changes collapsed.

sound/atmel/ac97c.h

0 → 100644
+71 −0
Original line number Diff line number Diff line
/*
 * Register definitions for the Atmel AC97C controller
 *
 * Copyright (C) 2005-2009 Atmel Corporation
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published
 * by the Free Software Foundation.
 */
#ifndef __SOUND_ATMEL_AC97C_H
#define __SOUND_ATMEL_AC97C_H

#define AC97C_MR		0x08
#define AC97C_ICA		0x10
#define AC97C_OCA		0x14
#define AC97C_CARHR		0x20
#define AC97C_CATHR		0x24
#define AC97C_CASR		0x28
#define AC97C_CAMR		0x2c
#define AC97C_CBRHR		0x30
#define AC97C_CBTHR		0x34
#define AC97C_CBSR		0x38
#define AC97C_CBMR		0x3c
#define AC97C_CORHR		0x40
#define AC97C_COTHR		0x44
#define AC97C_COSR		0x48
#define AC97C_COMR		0x4c
#define AC97C_SR		0x50
#define AC97C_IER		0x54
#define AC97C_IDR		0x58
#define AC97C_IMR		0x5c
#define AC97C_VERSION		0xfc

#define AC97C_CATPR		PDC_TPR
#define AC97C_CATCR		PDC_TCR
#define AC97C_CATNPR		PDC_TNPR
#define AC97C_CATNCR		PDC_TNCR
#define AC97C_CARPR		PDC_RPR
#define AC97C_CARCR		PDC_RCR
#define AC97C_CARNPR		PDC_RNPR
#define AC97C_CARNCR		PDC_RNCR
#define AC97C_PTCR		PDC_PTCR

#define AC97C_MR_ENA		(1 << 0)
#define AC97C_MR_WRST		(1 << 1)
#define AC97C_MR_VRA		(1 << 2)

#define AC97C_CSR_TXRDY		(1 << 0)
#define AC97C_CSR_UNRUN		(1 << 2)
#define AC97C_CSR_RXRDY		(1 << 4)
#define AC97C_CSR_ENDTX		(1 << 10)
#define AC97C_CSR_ENDRX		(1 << 14)

#define AC97C_CMR_SIZE_20	(0 << 16)
#define AC97C_CMR_SIZE_18	(1 << 16)
#define AC97C_CMR_SIZE_16	(2 << 16)
#define AC97C_CMR_SIZE_10	(3 << 16)
#define AC97C_CMR_CEM_LITTLE	(1 << 18)
#define AC97C_CMR_CEM_BIG	(0 << 18)
#define AC97C_CMR_CENA		(1 << 21)
#define AC97C_CMR_DMAEN		(1 << 22)

#define AC97C_SR_CAEVT		(1 << 3)

#define AC97C_CH_ASSIGN(slot, channel)					\
	(AC97C_CHANNEL_##channel << (3 * (AC97_SLOT_##slot - 3)))
#define AC97C_CHANNEL_NONE	0x0
#define AC97C_CHANNEL_A		0x1
#define AC97C_CHANNEL_B		0x2

#endif /* __SOUND_ATMEL_AC97C_H */