mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
Merge master.kernel.org:/pub/scm/linux/kernel/git/perex/alsa
* master.kernel.org:/pub/scm/linux/kernel/git/perex/alsa: [ALSA] echoaudio - Remove kfree_nocheck() [ALSA] echoaudio - Fix Makefile [ALSA] Add Intel D965 board support [ALSA] Fix/add support of Realtek ALC883 / ALC888 and ALC861 codecs [ALSA] Fix a typo in echoaudio/midi.c [ALSA] snd-aoa: enable dual-edge in GPIOs [ALSA] snd-aoa: support iMac G5 iSight [ALSA] snd-aoa: not experimental [ALSA] Add echoaudio sound drivers [ALSA] ak4xxx-adda - Code clean-up [ALSA] Remove CONFIG_EXPERIMENTAL from intel8x0m driver [ALSA] Stereo controls for M-Audio Revolution cards [ALSA] Fix misuse of __list_add() in seq_ports.c [ALSA] hda-codec - Add model entry for Samsung X60 Chane [ALSA] make CONFIG_SND_DYNAMIC_MINORS non-experimental [ALSA] Fix wrong dependencies of snd-aoa driver [ALSA] fix build failure due to snd-aoa [ALSA] AD1888 mixer controls for DC mode [ALSA] Suppress irq handler mismatch messages in ALSA ISA drivers [ALSA] usb-audio support for Turtle Beach Roadie
This commit is contained in:
@@ -472,6 +472,22 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
|
||||
The power-management is supported.
|
||||
|
||||
Module snd-darla20
|
||||
------------------
|
||||
|
||||
Module for Echoaudio Darla20
|
||||
|
||||
This module supports multiple cards.
|
||||
The driver requires the firmware loader support on kernel.
|
||||
|
||||
Module snd-darla24
|
||||
------------------
|
||||
|
||||
Module for Echoaudio Darla24
|
||||
|
||||
This module supports multiple cards.
|
||||
The driver requires the firmware loader support on kernel.
|
||||
|
||||
Module snd-dt019x
|
||||
-----------------
|
||||
|
||||
@@ -499,6 +515,14 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
|
||||
The power-management is supported.
|
||||
|
||||
Module snd-echo3g
|
||||
-----------------
|
||||
|
||||
Module for Echoaudio 3G cards (Gina3G/Layla3G)
|
||||
|
||||
This module supports multiple cards.
|
||||
The driver requires the firmware loader support on kernel.
|
||||
|
||||
Module snd-emu10k1
|
||||
------------------
|
||||
|
||||
@@ -657,6 +681,22 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
|
||||
The power-management is supported.
|
||||
|
||||
Module snd-gina20
|
||||
-----------------
|
||||
|
||||
Module for Echoaudio Gina20
|
||||
|
||||
This module supports multiple cards.
|
||||
The driver requires the firmware loader support on kernel.
|
||||
|
||||
Module snd-gina24
|
||||
-----------------
|
||||
|
||||
Module for Echoaudio Gina24
|
||||
|
||||
This module supports multiple cards.
|
||||
The driver requires the firmware loader support on kernel.
|
||||
|
||||
Module snd-gusclassic
|
||||
---------------------
|
||||
|
||||
@@ -760,12 +800,18 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
basic fixed pin assignment w/o SPDIF
|
||||
auto auto-config reading BIOS (default)
|
||||
|
||||
ALC882/883/885
|
||||
ALC882/885
|
||||
3stack-dig 3-jack with SPDIF I/O
|
||||
6stck-dig 6-jack digital with SPDIF I/O
|
||||
auto auto-config reading BIOS (default)
|
||||
|
||||
ALC861
|
||||
ALC883/888
|
||||
3stack-dig 3-jack with SPDIF I/O
|
||||
6stack-dig 6-jack digital with SPDIF I/O
|
||||
6stack-dig-demo 6-stack digital for Intel demo board
|
||||
auto auto-config reading BIOS (default)
|
||||
|
||||
ALC861/660
|
||||
3stack 3-jack
|
||||
3stack-dig 3-jack with SPDIF I/O
|
||||
6stack-dig 6-jack with SPDIF I/O
|
||||
@@ -937,6 +983,30 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
driver isn't configured properly or you want to try another
|
||||
type for testing.
|
||||
|
||||
Module snd-indigo
|
||||
-----------------
|
||||
|
||||
Module for Echoaudio Indigo
|
||||
|
||||
This module supports multiple cards.
|
||||
The driver requires the firmware loader support on kernel.
|
||||
|
||||
Module snd-indigodj
|
||||
-------------------
|
||||
|
||||
Module for Echoaudio Indigo DJ
|
||||
|
||||
This module supports multiple cards.
|
||||
The driver requires the firmware loader support on kernel.
|
||||
|
||||
Module snd-indigoio
|
||||
-------------------
|
||||
|
||||
Module for Echoaudio Indigo IO
|
||||
|
||||
This module supports multiple cards.
|
||||
The driver requires the firmware loader support on kernel.
|
||||
|
||||
Module snd-intel8x0
|
||||
-------------------
|
||||
|
||||
@@ -1036,6 +1106,22 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
|
||||
This module supports multiple cards.
|
||||
|
||||
Module snd-layla20
|
||||
------------------
|
||||
|
||||
Module for Echoaudio Layla20
|
||||
|
||||
This module supports multiple cards.
|
||||
The driver requires the firmware loader support on kernel.
|
||||
|
||||
Module snd-layla24
|
||||
------------------
|
||||
|
||||
Module for Echoaudio Layla24
|
||||
|
||||
This module supports multiple cards.
|
||||
The driver requires the firmware loader support on kernel.
|
||||
|
||||
Module snd-maestro3
|
||||
-------------------
|
||||
|
||||
@@ -1056,6 +1142,14 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
|
||||
The power-management is supported.
|
||||
|
||||
Module snd-mia
|
||||
---------------
|
||||
|
||||
Module for Echoaudio Mia
|
||||
|
||||
This module supports multiple cards.
|
||||
The driver requires the firmware loader support on kernel.
|
||||
|
||||
Module snd-miro
|
||||
---------------
|
||||
|
||||
@@ -1088,6 +1182,14 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
When no hotplug fw loader is available, you need to load the
|
||||
firmware via mixartloader utility in alsa-tools package.
|
||||
|
||||
Module snd-mona
|
||||
---------------
|
||||
|
||||
Module for Echoaudio Mona
|
||||
|
||||
This module supports multiple cards.
|
||||
The driver requires the firmware loader support on kernel.
|
||||
|
||||
Module snd-mpu401
|
||||
-----------------
|
||||
|
||||
|
||||
@@ -265,6 +265,7 @@
|
||||
|
||||
/* specific - Analog Devices */
|
||||
#define AC97_AD_TEST 0x5a /* test register */
|
||||
#define AC97_AD_TEST2 0x5c /* undocumented test register 2 */
|
||||
#define AC97_AD_CODEC_CFG 0x70 /* codec configuration */
|
||||
#define AC97_AD_JACK_SPDIF 0x72 /* Jack Sense & S/PDIF */
|
||||
#define AC97_AD_SERIAL_CFG 0x74 /* Serial Configuration */
|
||||
|
||||
@@ -32,8 +32,8 @@ struct snd_akm4xxx;
|
||||
struct snd_ak4xxx_ops {
|
||||
void (*lock)(struct snd_akm4xxx *ak, int chip);
|
||||
void (*unlock)(struct snd_akm4xxx *ak, int chip);
|
||||
void (*write)(struct snd_akm4xxx *ak, int chip, unsigned char reg, unsigned char val);
|
||||
// unsigned char (*read)(struct snd_akm4xxx *ak, int chip, unsigned char reg);
|
||||
void (*write)(struct snd_akm4xxx *ak, int chip, unsigned char reg,
|
||||
unsigned char val);
|
||||
void (*set_rate_val)(struct snd_akm4xxx *ak, unsigned int rate);
|
||||
};
|
||||
|
||||
@@ -41,29 +41,40 @@ struct snd_ak4xxx_ops {
|
||||
|
||||
struct snd_akm4xxx {
|
||||
struct snd_card *card;
|
||||
unsigned int num_adcs; /* AK4524 or AK4528 ADCs */
|
||||
unsigned int num_dacs; /* AK4524 or AK4528 DACs */
|
||||
unsigned char images[AK4XXX_IMAGE_SIZE]; /* saved register image */
|
||||
unsigned char ipga_gain[AK4XXX_MAX_CHIPS][2]; /* saved register image for IPGA (AK4528) */
|
||||
unsigned int num_adcs; /* AK4524 or AK4528 ADCs */
|
||||
unsigned int num_dacs; /* AK4524 or AK4528 DACs */
|
||||
unsigned char images[AK4XXX_IMAGE_SIZE]; /* saved register image */
|
||||
unsigned char ipga_gain[AK4XXX_MAX_CHIPS][2]; /* saved register image
|
||||
* for IPGA (AK4528)
|
||||
*/
|
||||
unsigned long private_value[AK4XXX_MAX_CHIPS]; /* helper for driver */
|
||||
void *private_data[AK4XXX_MAX_CHIPS]; /* helper for driver */
|
||||
/* template should fill the following fields */
|
||||
unsigned int idx_offset; /* control index offset */
|
||||
unsigned int idx_offset; /* control index offset */
|
||||
enum {
|
||||
SND_AK4524, SND_AK4528, SND_AK4529,
|
||||
SND_AK4355, SND_AK4358, SND_AK4381
|
||||
} type;
|
||||
unsigned int *num_stereo; /* array of combined counts
|
||||
* for the mixer
|
||||
*/
|
||||
char **channel_names; /* array of mixer channel names */
|
||||
struct snd_ak4xxx_ops ops;
|
||||
};
|
||||
|
||||
void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg, unsigned char val);
|
||||
void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg,
|
||||
unsigned char val);
|
||||
void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state);
|
||||
void snd_akm4xxx_init(struct snd_akm4xxx *ak);
|
||||
int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak);
|
||||
|
||||
#define snd_akm4xxx_get(ak,chip,reg) (ak)->images[(chip) * 16 + (reg)]
|
||||
#define snd_akm4xxx_set(ak,chip,reg,val) ((ak)->images[(chip) * 16 + (reg)] = (val))
|
||||
#define snd_akm4xxx_get_ipga(ak,chip,reg) (ak)->ipga_gain[chip][(reg)-4]
|
||||
#define snd_akm4xxx_set_ipga(ak,chip,reg,val) ((ak)->ipga_gain[chip][(reg)-4] = (val))
|
||||
#define snd_akm4xxx_get(ak,chip,reg) \
|
||||
(ak)->images[(chip) * 16 + (reg)]
|
||||
#define snd_akm4xxx_set(ak,chip,reg,val) \
|
||||
((ak)->images[(chip) * 16 + (reg)] = (val))
|
||||
#define snd_akm4xxx_get_ipga(ak,chip,reg) \
|
||||
(ak)->ipga_gain[chip][(reg)-4]
|
||||
#define snd_akm4xxx_set_ipga(ak,chip,reg,val) \
|
||||
((ak)->ipga_gain[chip][(reg)-4] = (val))
|
||||
|
||||
#endif /* __SOUND_AK4XXX_ADDA_H */
|
||||
|
||||
@@ -62,7 +62,8 @@ static int snd_legacy_find_free_irq(int *irq_table)
|
||||
{
|
||||
while (*irq_table != -1) {
|
||||
if (!request_irq(*irq_table, snd_legacy_empty_irq_handler,
|
||||
SA_INTERRUPT, "ALSA Test IRQ", (void *) irq_table)) {
|
||||
SA_INTERRUPT | SA_PROBEIRQ, "ALSA Test IRQ",
|
||||
(void *) irq_table)) {
|
||||
free_irq(*irq_table, (void *) irq_table);
|
||||
return *irq_table;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
obj-$(CONFIG_SOUND) += soundcore.o
|
||||
obj-$(CONFIG_SOUND_PRIME) += oss/
|
||||
obj-$(CONFIG_DMASOUND) += oss/
|
||||
obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ synth/ usb/ sparc/ parisc/ pcmcia/ mips/ aoa/
|
||||
obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ synth/ usb/ sparc/ parisc/ pcmcia/ mips/
|
||||
obj-$(CONFIG_SND_AOA) += aoa/
|
||||
|
||||
ifeq ($(CONFIG_SND),y)
|
||||
obj-y += last.o
|
||||
|
||||
@@ -3,7 +3,8 @@ menu "Apple Onboard Audio driver"
|
||||
|
||||
config SND_AOA
|
||||
tristate "Apple Onboard Audio driver"
|
||||
depends on SOUND && SND_PCM
|
||||
depends on SND
|
||||
select SND_PCM
|
||||
---help---
|
||||
This option enables the new driver for the various
|
||||
Apple Onboard Audio components.
|
||||
|
||||
@@ -207,6 +207,17 @@ static void ftr_handle_notify(void *data)
|
||||
mutex_unlock(¬if->mutex);
|
||||
}
|
||||
|
||||
static void gpio_enable_dual_edge(int gpio)
|
||||
{
|
||||
int v;
|
||||
|
||||
if (gpio == -1)
|
||||
return;
|
||||
v = pmac_call_feature(PMAC_FTR_READ_GPIO, NULL, gpio, 0);
|
||||
v |= 0x80; /* enable dual edge */
|
||||
pmac_call_feature(PMAC_FTR_WRITE_GPIO, NULL, gpio, v);
|
||||
}
|
||||
|
||||
static void ftr_gpio_init(struct gpio_runtime *rt)
|
||||
{
|
||||
get_gpio("headphone-mute", NULL,
|
||||
@@ -234,6 +245,10 @@ static void ftr_gpio_init(struct gpio_runtime *rt)
|
||||
&linein_detect_gpio,
|
||||
&linein_detect_gpio_activestate);
|
||||
|
||||
gpio_enable_dual_edge(headphone_detect_gpio);
|
||||
gpio_enable_dual_edge(lineout_detect_gpio);
|
||||
gpio_enable_dual_edge(linein_detect_gpio);
|
||||
|
||||
get_irq(headphone_detect_node, &headphone_detect_irq);
|
||||
get_irq(lineout_detect_node, &lineout_detect_irq);
|
||||
get_irq(linein_detect_node, &linein_detect_irq);
|
||||
|
||||
@@ -94,6 +94,7 @@ MODULE_ALIAS("sound-layout-82");
|
||||
MODULE_ALIAS("sound-layout-84");
|
||||
MODULE_ALIAS("sound-layout-86");
|
||||
MODULE_ALIAS("sound-layout-92");
|
||||
MODULE_ALIAS("sound-layout-96");
|
||||
|
||||
/* onyx with all but microphone connected */
|
||||
static struct codec_connection onyx_connections_nomic[] = {
|
||||
@@ -381,6 +382,13 @@ static struct layout layouts[] = {
|
||||
.connections = toonie_connections,
|
||||
},
|
||||
},
|
||||
{
|
||||
.layout_id = 96,
|
||||
.codecs[0] = {
|
||||
.name = "onyx",
|
||||
.connections = onyx_connections_noheadphones,
|
||||
},
|
||||
},
|
||||
/* unknown, untested, but this comes from Apple */
|
||||
{ .layout_id = 41,
|
||||
.codecs[0] = {
|
||||
@@ -479,12 +487,6 @@ static struct layout layouts[] = {
|
||||
.connections = onyx_connections_noheadphones,
|
||||
},
|
||||
},
|
||||
{ .layout_id = 96,
|
||||
.codecs[0] = {
|
||||
.name = "onyx",
|
||||
.connections = onyx_connections_noheadphones,
|
||||
},
|
||||
},
|
||||
{ .layout_id = 98,
|
||||
.codecs[0] = {
|
||||
.name = "toonie",
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
config SND_AOA_SOUNDBUS
|
||||
tristate "Apple Soundbus support"
|
||||
depends on SOUND && SND_PCM && EXPERIMENTAL
|
||||
depends on SOUND
|
||||
select SND_PCM
|
||||
---help---
|
||||
This option enables the generic driver for the soundbus
|
||||
support on Apple machines.
|
||||
|
||||
@@ -122,8 +122,8 @@ config SND_SEQ_RTCTIMER_DEFAULT
|
||||
If in doubt, say Y.
|
||||
|
||||
config SND_DYNAMIC_MINORS
|
||||
bool "Dynamic device file minor numbers (EXPERIMENTAL)"
|
||||
depends on SND && EXPERIMENTAL
|
||||
bool "Dynamic device file minor numbers"
|
||||
depends on SND
|
||||
help
|
||||
If you say Y here, the minor numbers of ALSA device files in
|
||||
/dev/snd/ are allocated dynamically. This allows you to have
|
||||
|
||||
@@ -322,10 +322,8 @@ int snd_seq_delete_all_ports(struct snd_seq_client *client)
|
||||
mutex_lock(&client->ports_mutex);
|
||||
write_lock_irqsave(&client->ports_lock, flags);
|
||||
if (! list_empty(&client->ports_list_head)) {
|
||||
__list_add(&deleted_list,
|
||||
client->ports_list_head.prev,
|
||||
client->ports_list_head.next);
|
||||
INIT_LIST_HEAD(&client->ports_list_head);
|
||||
list_add(&deleted_list, &client->ports_list_head);
|
||||
list_del_init(&client->ports_list_head);
|
||||
} else {
|
||||
INIT_LIST_HEAD(&deleted_list);
|
||||
}
|
||||
|
||||
@@ -34,7 +34,8 @@ MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>, Takashi Iwai <tiwai@suse.de>");
|
||||
MODULE_DESCRIPTION("Routines for control of AK452x / AK43xx AD/DA converters");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg, unsigned char val)
|
||||
void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg,
|
||||
unsigned char val)
|
||||
{
|
||||
ak->ops.lock(ak, chip);
|
||||
ak->ops.write(ak, chip, reg, val);
|
||||
@@ -52,6 +53,67 @@ void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg, unsi
|
||||
ak->ops.unlock(ak, chip);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(snd_akm4xxx_write);
|
||||
|
||||
/* reset procedure for AK4524 and AK4528 */
|
||||
static void ak4524_reset(struct snd_akm4xxx *ak, int state)
|
||||
{
|
||||
unsigned int chip;
|
||||
unsigned char reg, maxreg;
|
||||
|
||||
if (ak->type == SND_AK4528)
|
||||
maxreg = 0x06;
|
||||
else
|
||||
maxreg = 0x08;
|
||||
for (chip = 0; chip < ak->num_dacs/2; chip++) {
|
||||
snd_akm4xxx_write(ak, chip, 0x01, state ? 0x00 : 0x03);
|
||||
if (state)
|
||||
continue;
|
||||
/* DAC volumes */
|
||||
for (reg = 0x04; reg < maxreg; reg++)
|
||||
snd_akm4xxx_write(ak, chip, reg,
|
||||
snd_akm4xxx_get(ak, chip, reg));
|
||||
if (ak->type == SND_AK4528)
|
||||
continue;
|
||||
/* IPGA */
|
||||
for (reg = 0x04; reg < 0x06; reg++)
|
||||
snd_akm4xxx_write(ak, chip, reg,
|
||||
snd_akm4xxx_get_ipga(ak, chip, reg));
|
||||
}
|
||||
}
|
||||
|
||||
/* reset procedure for AK4355 and AK4358 */
|
||||
static void ak4355_reset(struct snd_akm4xxx *ak, int state)
|
||||
{
|
||||
unsigned char reg;
|
||||
|
||||
if (state) {
|
||||
snd_akm4xxx_write(ak, 0, 0x01, 0x02); /* reset and soft-mute */
|
||||
return;
|
||||
}
|
||||
for (reg = 0x00; reg < 0x0b; reg++)
|
||||
if (reg != 0x01)
|
||||
snd_akm4xxx_write(ak, 0, reg,
|
||||
snd_akm4xxx_get(ak, 0, reg));
|
||||
snd_akm4xxx_write(ak, 0, 0x01, 0x01); /* un-reset, unmute */
|
||||
}
|
||||
|
||||
/* reset procedure for AK4381 */
|
||||
static void ak4381_reset(struct snd_akm4xxx *ak, int state)
|
||||
{
|
||||
unsigned int chip;
|
||||
unsigned char reg;
|
||||
|
||||
for (chip = 0; chip < ak->num_dacs/2; chip++) {
|
||||
snd_akm4xxx_write(ak, chip, 0x00, state ? 0x0c : 0x0f);
|
||||
if (state)
|
||||
continue;
|
||||
for (reg = 0x01; reg < 0x05; reg++)
|
||||
snd_akm4xxx_write(ak, chip, reg,
|
||||
snd_akm4xxx_get(ak, chip, reg));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* reset the AKM codecs
|
||||
* @state: 1 = reset codec, 0 = restore the registers
|
||||
@@ -60,52 +122,26 @@ void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg, unsi
|
||||
*/
|
||||
void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state)
|
||||
{
|
||||
unsigned int chip;
|
||||
unsigned char reg;
|
||||
|
||||
switch (ak->type) {
|
||||
case SND_AK4524:
|
||||
case SND_AK4528:
|
||||
for (chip = 0; chip < ak->num_dacs/2; chip++) {
|
||||
snd_akm4xxx_write(ak, chip, 0x01, state ? 0x00 : 0x03);
|
||||
if (state)
|
||||
continue;
|
||||
/* DAC volumes */
|
||||
for (reg = 0x04; reg < (ak->type == SND_AK4528 ? 0x06 : 0x08); reg++)
|
||||
snd_akm4xxx_write(ak, chip, reg, snd_akm4xxx_get(ak, chip, reg));
|
||||
if (ak->type == SND_AK4528)
|
||||
continue;
|
||||
/* IPGA */
|
||||
for (reg = 0x04; reg < 0x06; reg++)
|
||||
snd_akm4xxx_write(ak, chip, reg, snd_akm4xxx_get_ipga(ak, chip, reg));
|
||||
}
|
||||
ak4524_reset(ak, state);
|
||||
break;
|
||||
case SND_AK4529:
|
||||
/* FIXME: needed for ak4529? */
|
||||
break;
|
||||
case SND_AK4355:
|
||||
case SND_AK4358:
|
||||
if (state) {
|
||||
snd_akm4xxx_write(ak, 0, 0x01, 0x02); /* reset and soft-mute */
|
||||
return;
|
||||
}
|
||||
for (reg = 0x00; reg < 0x0b; reg++)
|
||||
if (reg != 0x01)
|
||||
snd_akm4xxx_write(ak, 0, reg, snd_akm4xxx_get(ak, 0, reg));
|
||||
snd_akm4xxx_write(ak, 0, 0x01, 0x01); /* un-reset, unmute */
|
||||
ak4355_reset(ak, state);
|
||||
break;
|
||||
case SND_AK4381:
|
||||
for (chip = 0; chip < ak->num_dacs/2; chip++) {
|
||||
snd_akm4xxx_write(ak, chip, 0x00, state ? 0x0c : 0x0f);
|
||||
if (state)
|
||||
continue;
|
||||
for (reg = 0x01; reg < 0x05; reg++)
|
||||
snd_akm4xxx_write(ak, chip, reg, snd_akm4xxx_get(ak, chip, reg));
|
||||
}
|
||||
ak4381_reset(ak, state);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(snd_akm4xxx_reset);
|
||||
|
||||
/*
|
||||
* initialize all the ak4xxx chips
|
||||
*/
|
||||
@@ -153,7 +189,8 @@ void snd_akm4xxx_init(struct snd_akm4xxx *ak)
|
||||
};
|
||||
static unsigned char inits_ak4355[] = {
|
||||
0x01, 0x02, /* 1: reset and soft-mute */
|
||||
0x00, 0x06, /* 0: mode3(i2s), disable auto-clock detect, disable DZF, sharp roll-off, RSTN#=0 */
|
||||
0x00, 0x06, /* 0: mode3(i2s), disable auto-clock detect,
|
||||
* disable DZF, sharp roll-off, RSTN#=0 */
|
||||
0x02, 0x0e, /* 2: DA's power up, normal speed, RSTN#=0 */
|
||||
// 0x02, 0x2e, /* quad speed */
|
||||
0x03, 0x01, /* 3: de-emphasis off */
|
||||
@@ -169,7 +206,8 @@ void snd_akm4xxx_init(struct snd_akm4xxx *ak)
|
||||
};
|
||||
static unsigned char inits_ak4358[] = {
|
||||
0x01, 0x02, /* 1: reset and soft-mute */
|
||||
0x00, 0x06, /* 0: mode3(i2s), disable auto-clock detect, disable DZF, sharp roll-off, RSTN#=0 */
|
||||
0x00, 0x06, /* 0: mode3(i2s), disable auto-clock detect,
|
||||
* disable DZF, sharp roll-off, RSTN#=0 */
|
||||
0x02, 0x0e, /* 2: DA's power up, normal speed, RSTN#=0 */
|
||||
// 0x02, 0x2e, /* quad speed */
|
||||
0x03, 0x01, /* 3: de-emphasis off */
|
||||
@@ -187,7 +225,8 @@ void snd_akm4xxx_init(struct snd_akm4xxx *ak)
|
||||
};
|
||||
static unsigned char inits_ak4381[] = {
|
||||
0x00, 0x0c, /* 0: mode3(i2s), disable auto-clock detect */
|
||||
0x01, 0x02, /* 1: de-emphasis off, normal speed, sharp roll-off, DZF off */
|
||||
0x01, 0x02, /* 1: de-emphasis off, normal speed,
|
||||
* sharp roll-off, DZF off */
|
||||
// 0x01, 0x12, /* quad speed */
|
||||
0x02, 0x00, /* 2: DZF disabled */
|
||||
0x03, 0x00, /* 3: LATT 0 */
|
||||
@@ -239,12 +278,15 @@ void snd_akm4xxx_init(struct snd_akm4xxx *ak)
|
||||
}
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(snd_akm4xxx_init);
|
||||
|
||||
#define AK_GET_CHIP(val) (((val) >> 8) & 0xff)
|
||||
#define AK_GET_ADDR(val) ((val) & 0xff)
|
||||
#define AK_GET_SHIFT(val) (((val) >> 16) & 0x7f)
|
||||
#define AK_GET_INVERT(val) (((val) >> 23) & 1)
|
||||
#define AK_GET_MASK(val) (((val) >> 24) & 0xff)
|
||||
#define AK_COMPOSE(chip,addr,shift,mask) (((chip) << 8) | (addr) | ((shift) << 16) | ((mask) << 24))
|
||||
#define AK_COMPOSE(chip,addr,shift,mask) \
|
||||
(((chip) << 8) | (addr) | ((shift) << 16) | ((mask) << 24))
|
||||
#define AK_INVERT (1<<23)
|
||||
|
||||
static int snd_akm4xxx_volume_info(struct snd_kcontrol *kcontrol,
|
||||
@@ -292,6 +334,64 @@ static int snd_akm4xxx_volume_put(struct snd_kcontrol *kcontrol,
|
||||
return change;
|
||||
}
|
||||
|
||||
static int snd_akm4xxx_stereo_volume_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo)
|
||||
{
|
||||
unsigned int mask = AK_GET_MASK(kcontrol->private_value);
|
||||
|
||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
|
||||
uinfo->count = 2;
|
||||
uinfo->value.integer.min = 0;
|
||||
uinfo->value.integer.max = mask;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_akm4xxx_stereo_volume_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
|
||||
int chip = AK_GET_CHIP(kcontrol->private_value);
|
||||
int addr = AK_GET_ADDR(kcontrol->private_value);
|
||||
int invert = AK_GET_INVERT(kcontrol->private_value);
|
||||
unsigned int mask = AK_GET_MASK(kcontrol->private_value);
|
||||
unsigned char val = snd_akm4xxx_get(ak, chip, addr);
|
||||
|
||||
ucontrol->value.integer.value[0] = invert ? mask - val : val;
|
||||
|
||||
val = snd_akm4xxx_get(ak, chip, addr+1);
|
||||
ucontrol->value.integer.value[1] = invert ? mask - val : val;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_akm4xxx_stereo_volume_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
|
||||
int chip = AK_GET_CHIP(kcontrol->private_value);
|
||||
int addr = AK_GET_ADDR(kcontrol->private_value);
|
||||
int invert = AK_GET_INVERT(kcontrol->private_value);
|
||||
unsigned int mask = AK_GET_MASK(kcontrol->private_value);
|
||||
unsigned char nval = ucontrol->value.integer.value[0] % (mask+1);
|
||||
int change0, change1;
|
||||
|
||||
if (invert)
|
||||
nval = mask - nval;
|
||||
change0 = snd_akm4xxx_get(ak, chip, addr) != nval;
|
||||
if (change0)
|
||||
snd_akm4xxx_write(ak, chip, addr, nval);
|
||||
|
||||
nval = ucontrol->value.integer.value[1] % (mask+1);
|
||||
if (invert)
|
||||
nval = mask - nval;
|
||||
change1 = snd_akm4xxx_get(ak, chip, addr+1) != nval;
|
||||
if (change1)
|
||||
snd_akm4xxx_write(ak, chip, addr+1, nval);
|
||||
|
||||
|
||||
return change0 || change1;
|
||||
}
|
||||
|
||||
static int snd_akm4xxx_ipga_gain_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo)
|
||||
{
|
||||
@@ -308,7 +408,8 @@ static int snd_akm4xxx_ipga_gain_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
|
||||
int chip = AK_GET_CHIP(kcontrol->private_value);
|
||||
int addr = AK_GET_ADDR(kcontrol->private_value);
|
||||
ucontrol->value.integer.value[0] = snd_akm4xxx_get_ipga(ak, chip, addr) & 0x7f;
|
||||
ucontrol->value.integer.value[0] =
|
||||
snd_akm4xxx_get_ipga(ak, chip, addr) & 0x7f;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -336,7 +437,8 @@ static int snd_akm4xxx_deemphasis_info(struct snd_kcontrol *kcontrol,
|
||||
uinfo->value.enumerated.items = 4;
|
||||
if (uinfo->value.enumerated.item >= 4)
|
||||
uinfo->value.enumerated.item = 3;
|
||||
strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
|
||||
strcpy(uinfo->value.enumerated.name,
|
||||
texts[uinfo->value.enumerated.item]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -347,7 +449,8 @@ static int snd_akm4xxx_deemphasis_get(struct snd_kcontrol *kcontrol,
|
||||
int chip = AK_GET_CHIP(kcontrol->private_value);
|
||||
int addr = AK_GET_ADDR(kcontrol->private_value);
|
||||
int shift = AK_GET_SHIFT(kcontrol->private_value);
|
||||
ucontrol->value.enumerated.item[0] = (snd_akm4xxx_get(ak, chip, addr) >> shift) & 3;
|
||||
ucontrol->value.enumerated.item[0] =
|
||||
(snd_akm4xxx_get(ak, chip, addr) >> shift) & 3;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -361,7 +464,8 @@ static int snd_akm4xxx_deemphasis_put(struct snd_kcontrol *kcontrol,
|
||||
unsigned char nval = ucontrol->value.enumerated.item[0] & 3;
|
||||
int change;
|
||||
|
||||
nval = (nval << shift) | (snd_akm4xxx_get(ak, chip, addr) & ~(3 << shift));
|
||||
nval = (nval << shift) |
|
||||
(snd_akm4xxx_get(ak, chip, addr) & ~(3 << shift));
|
||||
change = snd_akm4xxx_get(ak, chip, addr) != nval;
|
||||
if (change)
|
||||
snd_akm4xxx_write(ak, chip, addr, nval);
|
||||
@@ -377,51 +481,86 @@ int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak)
|
||||
unsigned int idx, num_emphs;
|
||||
struct snd_kcontrol *ctl;
|
||||
int err;
|
||||
int mixer_ch = 0;
|
||||
int num_stereo;
|
||||
|
||||
ctl = kmalloc(sizeof(*ctl), GFP_KERNEL);
|
||||
if (! ctl)
|
||||
return -ENOMEM;
|
||||
|
||||
for (idx = 0; idx < ak->num_dacs; ++idx) {
|
||||
for (idx = 0; idx < ak->num_dacs; ) {
|
||||
memset(ctl, 0, sizeof(*ctl));
|
||||
strcpy(ctl->id.name, "DAC Volume");
|
||||
ctl->id.index = idx + ak->idx_offset * 2;
|
||||
if (ak->channel_names == NULL) {
|
||||
strcpy(ctl->id.name, "DAC Volume");
|
||||
num_stereo = 1;
|
||||
ctl->id.index = mixer_ch + ak->idx_offset * 2;
|
||||
} else {
|
||||
strcpy(ctl->id.name, ak->channel_names[mixer_ch]);
|
||||
num_stereo = ak->num_stereo[mixer_ch];
|
||||
ctl->id.index = 0;
|
||||
}
|
||||
ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
|
||||
ctl->count = 1;
|
||||
ctl->info = snd_akm4xxx_volume_info;
|
||||
ctl->get = snd_akm4xxx_volume_get;
|
||||
ctl->put = snd_akm4xxx_volume_put;
|
||||
if (num_stereo == 2) {
|
||||
ctl->info = snd_akm4xxx_stereo_volume_info;
|
||||
ctl->get = snd_akm4xxx_stereo_volume_get;
|
||||
ctl->put = snd_akm4xxx_stereo_volume_put;
|
||||
} else {
|
||||
ctl->info = snd_akm4xxx_volume_info;
|
||||
ctl->get = snd_akm4xxx_volume_get;
|
||||
ctl->put = snd_akm4xxx_volume_put;
|
||||
}
|
||||
switch (ak->type) {
|
||||
case SND_AK4524:
|
||||
ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 6, 0, 127); /* register 6 & 7 */
|
||||
/* register 6 & 7 */
|
||||
ctl->private_value =
|
||||
AK_COMPOSE(idx/2, (idx%2) + 6, 0, 127);
|
||||
break;
|
||||
case SND_AK4528:
|
||||
ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127); /* register 4 & 5 */
|
||||
/* register 4 & 5 */
|
||||
ctl->private_value =
|
||||
AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127);
|
||||
break;
|
||||
case SND_AK4529: {
|
||||
int val = idx < 6 ? idx + 2 : (idx - 6) + 0xb; /* registers 2-7 and b,c */
|
||||
ctl->private_value = AK_COMPOSE(0, val, 0, 255) | AK_INVERT;
|
||||
/* registers 2-7 and b,c */
|
||||
int val = idx < 6 ? idx + 2 : (idx - 6) + 0xb;
|
||||
ctl->private_value =
|
||||
AK_COMPOSE(0, val, 0, 255) | AK_INVERT;
|
||||
break;
|
||||
}
|
||||
case SND_AK4355:
|
||||
ctl->private_value = AK_COMPOSE(0, idx + 4, 0, 255); /* register 4-9, chip #0 only */
|
||||
/* register 4-9, chip #0 only */
|
||||
ctl->private_value = AK_COMPOSE(0, idx + 4, 0, 255);
|
||||
break;
|
||||
case SND_AK4358:
|
||||
if (idx >= 6)
|
||||
ctl->private_value = AK_COMPOSE(0, idx + 5, 0, 255); /* register 4-9, chip #0 only */
|
||||
/* register 4-9, chip #0 only */
|
||||
ctl->private_value =
|
||||
AK_COMPOSE(0, idx + 5, 0, 255);
|
||||
else
|
||||
ctl->private_value = AK_COMPOSE(0, idx + 4, 0, 255); /* register 4-9, chip #0 only */
|
||||
/* register 4-9, chip #0 only */
|
||||
ctl->private_value =
|
||||
AK_COMPOSE(0, idx + 4, 0, 255);
|
||||
break;
|
||||
case SND_AK4381:
|
||||
ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 3, 0, 255); /* register 3 & 4 */
|
||||
/* register 3 & 4 */
|
||||
ctl->private_value =
|
||||
AK_COMPOSE(idx/2, (idx%2) + 3, 0, 255);
|
||||
break;
|
||||
default:
|
||||
err = -EINVAL;
|
||||
goto __error;
|
||||
}
|
||||
|
||||
ctl->private_data = ak;
|
||||
if ((err = snd_ctl_add(ak->card, snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0)
|
||||
err = snd_ctl_add(ak->card,
|
||||
snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|
|
||||
SNDRV_CTL_ELEM_ACCESS_WRITE));
|
||||
if (err < 0)
|
||||
goto __error;
|
||||
|
||||
idx += num_stereo;
|
||||
mixer_ch++;
|
||||
}
|
||||
for (idx = 0; idx < ak->num_adcs && ak->type == SND_AK4524; ++idx) {
|
||||
memset(ctl, 0, sizeof(*ctl));
|
||||
@@ -432,9 +571,14 @@ int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak)
|
||||
ctl->info = snd_akm4xxx_volume_info;
|
||||
ctl->get = snd_akm4xxx_volume_get;
|
||||
ctl->put = snd_akm4xxx_volume_put;
|
||||
ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127); /* register 4 & 5 */
|
||||
/* register 4 & 5 */
|
||||
ctl->private_value =
|
||||
AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127);
|
||||
ctl->private_data = ak;
|
||||
if ((err = snd_ctl_add(ak->card, snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0)
|
||||
err = snd_ctl_add(ak->card,
|
||||
snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|
|
||||
SNDRV_CTL_ELEM_ACCESS_WRITE));
|
||||
if (err < 0)
|
||||
goto __error;
|
||||
|
||||
memset(ctl, 0, sizeof(*ctl));
|
||||
@@ -445,9 +589,13 @@ int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak)
|
||||
ctl->info = snd_akm4xxx_ipga_gain_info;
|
||||
ctl->get = snd_akm4xxx_ipga_gain_get;
|
||||
ctl->put = snd_akm4xxx_ipga_gain_put;
|
||||
ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 4, 0, 0); /* register 4 & 5 */
|
||||
/* register 4 & 5 */
|
||||
ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 4, 0, 0);
|
||||
ctl->private_data = ak;
|
||||
if ((err = snd_ctl_add(ak->card, snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0)
|
||||
err = snd_ctl_add(ak->card,
|
||||
snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|
|
||||
SNDRV_CTL_ELEM_ACCESS_WRITE));
|
||||
if (err < 0)
|
||||
goto __error;
|
||||
}
|
||||
if (ak->type == SND_AK4355 || ak->type == SND_AK4358)
|
||||
@@ -466,11 +614,13 @@ int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak)
|
||||
switch (ak->type) {
|
||||
case SND_AK4524:
|
||||
case SND_AK4528:
|
||||
ctl->private_value = AK_COMPOSE(idx, 3, 0, 0); /* register 3 */
|
||||
/* register 3 */
|
||||
ctl->private_value = AK_COMPOSE(idx, 3, 0, 0);
|
||||
break;
|
||||
case SND_AK4529: {
|
||||
int shift = idx == 3 ? 6 : (2 - idx) * 2;
|
||||
ctl->private_value = AK_COMPOSE(0, 8, shift, 0); /* register 8 with shift */
|
||||
/* register 8 with shift */
|
||||
ctl->private_value = AK_COMPOSE(0, 8, shift, 0);
|
||||
break;
|
||||
}
|
||||
case SND_AK4355:
|
||||
@@ -482,7 +632,10 @@ int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak)
|
||||
break;
|
||||
}
|
||||
ctl->private_data = ak;
|
||||
if ((err = snd_ctl_add(ak->card, snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0)
|
||||
err = snd_ctl_add(ak->card,
|
||||
snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|
|
||||
SNDRV_CTL_ELEM_ACCESS_WRITE));
|
||||
if (err < 0)
|
||||
goto __error;
|
||||
}
|
||||
err = 0;
|
||||
@@ -492,6 +645,8 @@ int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak)
|
||||
return err;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(snd_akm4xxx_build_controls);
|
||||
|
||||
static int __init alsa_akm4xxx_module_init(void)
|
||||
{
|
||||
return 0;
|
||||
@@ -503,8 +658,3 @@ static void __exit alsa_akm4xxx_module_exit(void)
|
||||
|
||||
module_init(alsa_akm4xxx_module_init)
|
||||
module_exit(alsa_akm4xxx_module_exit)
|
||||
|
||||
EXPORT_SYMBOL(snd_akm4xxx_write);
|
||||
EXPORT_SYMBOL(snd_akm4xxx_reset);
|
||||
EXPORT_SYMBOL(snd_akm4xxx_init);
|
||||
EXPORT_SYMBOL(snd_akm4xxx_build_controls);
|
||||
|
||||
@@ -233,6 +233,143 @@ config SND_CS5535AUDIO
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-cs5535audio.
|
||||
|
||||
config SND_DARLA20
|
||||
tristate "(Echoaudio) Darla20"
|
||||
depends on SND
|
||||
depends on FW_LOADER
|
||||
select SND_PCM
|
||||
help
|
||||
Say 'Y' or 'M' to include support for Echoaudio Darla.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-darla20
|
||||
|
||||
config SND_GINA20
|
||||
tristate "(Echoaudio) Gina20"
|
||||
depends on SND
|
||||
depends on FW_LOADER
|
||||
select SND_PCM
|
||||
help
|
||||
Say 'Y' or 'M' to include support for Echoaudio Gina.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-gina20
|
||||
|
||||
config SND_LAYLA20
|
||||
tristate "(Echoaudio) Layla20"
|
||||
depends on SND
|
||||
depends on FW_LOADER
|
||||
select SND_RAWMIDI
|
||||
select SND_PCM
|
||||
help
|
||||
Say 'Y' or 'M' to include support for Echoaudio Layla.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-layla20
|
||||
|
||||
config SND_DARLA24
|
||||
tristate "(Echoaudio) Darla24"
|
||||
depends on SND
|
||||
depends on FW_LOADER
|
||||
select SND_PCM
|
||||
help
|
||||
Say 'Y' or 'M' to include support for Echoaudio Darla24.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-darla24
|
||||
|
||||
config SND_GINA24
|
||||
tristate "(Echoaudio) Gina24"
|
||||
depends on SND
|
||||
depends on FW_LOADER
|
||||
select SND_PCM
|
||||
help
|
||||
Say 'Y' or 'M' to include support for Echoaudio Gina24.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-gina24
|
||||
|
||||
config SND_LAYLA24
|
||||
tristate "(Echoaudio) Layla24"
|
||||
depends on SND
|
||||
depends on FW_LOADER
|
||||
select SND_RAWMIDI
|
||||
select SND_PCM
|
||||
help
|
||||
Say 'Y' or 'M' to include support for Echoaudio Layla24.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-layla24
|
||||
|
||||
config SND_MONA
|
||||
tristate "(Echoaudio) Mona"
|
||||
depends on SND
|
||||
depends on FW_LOADER
|
||||
select SND_RAWMIDI
|
||||
select SND_PCM
|
||||
help
|
||||
Say 'Y' or 'M' to include support for Echoaudio Mona.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-mona
|
||||
|
||||
config SND_MIA
|
||||
tristate "(Echoaudio) Mia"
|
||||
depends on SND
|
||||
depends on FW_LOADER
|
||||
select SND_RAWMIDI
|
||||
select SND_PCM
|
||||
help
|
||||
Say 'Y' or 'M' to include support for Echoaudio Mia and Mia-midi.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-mia
|
||||
|
||||
config SND_ECHO3G
|
||||
tristate "(Echoaudio) 3G cards"
|
||||
depends on SND
|
||||
depends on FW_LOADER
|
||||
select SND_RAWMIDI
|
||||
select SND_PCM
|
||||
help
|
||||
Say 'Y' or 'M' to include support for Echoaudio Gina3G and Layla3G.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-echo3g
|
||||
|
||||
config SND_INDIGO
|
||||
tristate "(Echoaudio) Indigo"
|
||||
depends on SND
|
||||
depends on FW_LOADER
|
||||
select SND_PCM
|
||||
help
|
||||
Say 'Y' or 'M' to include support for Echoaudio Indigo.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-indigo
|
||||
|
||||
config SND_INDIGOIO
|
||||
tristate "(Echoaudio) Indigo IO"
|
||||
depends on SND
|
||||
depends on FW_LOADER
|
||||
select SND_PCM
|
||||
help
|
||||
Say 'Y' or 'M' to include support for Echoaudio Indigo IO.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-indigoio
|
||||
|
||||
config SND_INDIGODJ
|
||||
tristate "(Echoaudio) Indigo DJ"
|
||||
depends on SND
|
||||
depends on FW_LOADER
|
||||
select SND_PCM
|
||||
help
|
||||
Say 'Y' or 'M' to include support for Echoaudio Indigo DJ.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-indigodj
|
||||
|
||||
config SND_EMU10K1
|
||||
tristate "Emu10k1 (SB Live!, Audigy, E-mu APS)"
|
||||
depends on SND
|
||||
@@ -420,8 +557,8 @@ config SND_INTEL8X0
|
||||
will be called snd-intel8x0.
|
||||
|
||||
config SND_INTEL8X0M
|
||||
tristate "Intel/SiS/nVidia/AMD MC97 Modem (EXPERIMENTAL)"
|
||||
depends on SND && EXPERIMENTAL
|
||||
tristate "Intel/SiS/nVidia/AMD MC97 Modem"
|
||||
depends on SND
|
||||
select SND_AC97_CODEC
|
||||
help
|
||||
Say Y here to include support for the integrated MC97 modem on
|
||||
|
||||
@@ -57,6 +57,7 @@ obj-$(CONFIG_SND) += \
|
||||
ca0106/ \
|
||||
cs46xx/ \
|
||||
cs5535audio/ \
|
||||
echoaudio/ \
|
||||
emu10k1/ \
|
||||
hda/ \
|
||||
ice1712/ \
|
||||
|
||||
@@ -1824,6 +1824,8 @@ static const struct snd_kcontrol_new snd_ac97_ad1888_controls[] = {
|
||||
.get = snd_ac97_ad1888_lohpsel_get,
|
||||
.put = snd_ac97_ad1888_lohpsel_put
|
||||
},
|
||||
AC97_SINGLE("V_REFOUT Enable", AC97_AD_MISC, 2, 1, 1),
|
||||
AC97_SINGLE("High Pass Filter Enable", AC97_AD_TEST2, 12, 1, 1),
|
||||
AC97_SINGLE("Spread Front to Surround and Center/LFE", AC97_AD_MISC, 7, 1, 0),
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
|
||||
30
sound/pci/echoaudio/Makefile
Normal file
30
sound/pci/echoaudio/Makefile
Normal file
@@ -0,0 +1,30 @@
|
||||
#
|
||||
# Makefile for ALSA Echoaudio soundcard drivers
|
||||
# Copyright (c) 2003 by Giuliano Pochini <pochini@shiny.it>
|
||||
#
|
||||
|
||||
snd-darla20-objs := darla20.o
|
||||
snd-gina20-objs := gina20.o
|
||||
snd-layla20-objs := layla20.o
|
||||
snd-darla24-objs := darla24.o
|
||||
snd-gina24-objs := gina24.o
|
||||
snd-layla24-objs := layla24.o
|
||||
snd-mona-objs := mona.o
|
||||
snd-mia-objs := mia.o
|
||||
snd-echo3g-objs := echo3g.o
|
||||
snd-indigo-objs := indigo.o
|
||||
snd-indigoio-objs := indigoio.o
|
||||
snd-indigodj-objs := indigodj.o
|
||||
|
||||
obj-$(CONFIG_SND_DARLA20) += snd-darla20.o
|
||||
obj-$(CONFIG_SND_GINA20) += snd-gina20.o
|
||||
obj-$(CONFIG_SND_LAYLA20) += snd-layla20.o
|
||||
obj-$(CONFIG_SND_DARLA24) += snd-darla24.o
|
||||
obj-$(CONFIG_SND_GINA24) += snd-gina24.o
|
||||
obj-$(CONFIG_SND_LAYLA24) += snd-layla24.o
|
||||
obj-$(CONFIG_SND_MONA) += snd-mona.o
|
||||
obj-$(CONFIG_SND_MIA) += snd-mia.o
|
||||
obj-$(CONFIG_SND_ECHO3G) += snd-echo3g.o
|
||||
obj-$(CONFIG_SND_INDIGO) += snd-indigo.o
|
||||
obj-$(CONFIG_SND_INDIGOIO) += snd-indigoio.o
|
||||
obj-$(CONFIG_SND_INDIGODJ) += snd-indigodj.o
|
||||
99
sound/pci/echoaudio/darla20.c
Normal file
99
sound/pci/echoaudio/darla20.c
Normal file
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* ALSA driver for Echoaudio soundcards.
|
||||
* Copyright (C) 2003-2004 Giuliano Pochini <pochini@shiny.it>
|
||||
*
|
||||
* 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 of the License.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#define ECHOGALS_FAMILY
|
||||
#define ECHOCARD_DARLA20
|
||||
#define ECHOCARD_NAME "Darla20"
|
||||
#define ECHOCARD_HAS_MONITOR
|
||||
|
||||
/* Pipe indexes */
|
||||
#define PX_ANALOG_OUT 0 /* 8 */
|
||||
#define PX_DIGITAL_OUT 8 /* 0 */
|
||||
#define PX_ANALOG_IN 8 /* 2 */
|
||||
#define PX_DIGITAL_IN 10 /* 0 */
|
||||
#define PX_NUM 10
|
||||
|
||||
/* Bus indexes */
|
||||
#define BX_ANALOG_OUT 0 /* 8 */
|
||||
#define BX_DIGITAL_OUT 8 /* 0 */
|
||||
#define BX_ANALOG_IN 8 /* 2 */
|
||||
#define BX_DIGITAL_IN 10 /* 0 */
|
||||
#define BX_NUM 10
|
||||
|
||||
|
||||
#include <sound/driver.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/info.h>
|
||||
#include <sound/control.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/asoundef.h>
|
||||
#include <sound/initval.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/atomic.h>
|
||||
#include "echoaudio.h"
|
||||
|
||||
#define FW_DARLA20_DSP 0
|
||||
|
||||
static const struct firmware card_fw[] = {
|
||||
{0, "darla20_dsp.fw"}
|
||||
};
|
||||
|
||||
static struct pci_device_id snd_echo_ids[] = {
|
||||
{0x1057, 0x1801, 0xECC0, 0x0010, 0, 0, 0}, /* DSP 56301 Darla20 rev.0 */
|
||||
{0,}
|
||||
};
|
||||
|
||||
static struct snd_pcm_hardware pcm_hardware_skel = {
|
||||
.info = SNDRV_PCM_INFO_MMAP |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_BLOCK_TRANSFER |
|
||||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_PAUSE |
|
||||
SNDRV_PCM_INFO_SYNC_START,
|
||||
.formats = SNDRV_PCM_FMTBIT_U8 |
|
||||
SNDRV_PCM_FMTBIT_S16_LE |
|
||||
SNDRV_PCM_FMTBIT_S24_3LE |
|
||||
SNDRV_PCM_FMTBIT_S32_LE |
|
||||
SNDRV_PCM_FMTBIT_S32_BE,
|
||||
.rates = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
|
||||
.rate_min = 44100,
|
||||
.rate_max = 48000,
|
||||
.channels_min = 1,
|
||||
.channels_max = 2,
|
||||
.buffer_bytes_max = 262144,
|
||||
.period_bytes_min = 32,
|
||||
.period_bytes_max = 131072,
|
||||
.periods_min = 2,
|
||||
.periods_max = 220,
|
||||
/* One page (4k) contains 512 instructions. I don't know if the hw
|
||||
supports lists longer than this. In this case periods_max=220 is a
|
||||
safe limit to make sure the list never exceeds 512 instructions. */
|
||||
};
|
||||
|
||||
|
||||
#include "darla20_dsp.c"
|
||||
#include "echoaudio_dsp.c"
|
||||
#include "echoaudio.c"
|
||||
125
sound/pci/echoaudio/darla20_dsp.c
Normal file
125
sound/pci/echoaudio/darla20_dsp.c
Normal file
@@ -0,0 +1,125 @@
|
||||
/***************************************************************************
|
||||
|
||||
Copyright Echo Digital Audio Corporation (c) 1998 - 2004
|
||||
All rights reserved
|
||||
www.echoaudio.com
|
||||
|
||||
This file is part of Echo Digital Audio's generic driver library.
|
||||
|
||||
Echo Digital Audio's generic driver library 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.
|
||||
|
||||
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.
|
||||
|
||||
*************************************************************************
|
||||
|
||||
Translation from C++ and adaptation for use in ALSA-Driver
|
||||
were made by Giuliano Pochini <pochini@shiny.it>
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
{
|
||||
int err;
|
||||
|
||||
DE_INIT(("init_hw() - Darla20\n"));
|
||||
snd_assert((subdevice_id & 0xfff0) == DARLA20, return -ENODEV);
|
||||
|
||||
if ((err = init_dsp_comm_page(chip))) {
|
||||
DE_INIT(("init_hw - could not initialize DSP comm page\n"));
|
||||
return err;
|
||||
}
|
||||
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->dsp_code_to_load = &card_fw[FW_DARLA20_DSP];
|
||||
chip->spdif_status = GD_SPDIF_STATUS_UNDEF;
|
||||
chip->clock_state = GD_CLOCK_UNDEF;
|
||||
/* Since this card has no ASIC, mark it as loaded so everything
|
||||
works OK */
|
||||
chip->asic_loaded = TRUE;
|
||||
chip->input_clock_types = ECHO_CLOCK_BIT_INTERNAL;
|
||||
|
||||
if ((err = load_firmware(chip)) < 0)
|
||||
return err;
|
||||
chip->bad_board = FALSE;
|
||||
|
||||
if ((err = init_line_levels(chip)) < 0)
|
||||
return err;
|
||||
|
||||
DE_INIT(("init_hw done\n"));
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* The Darla20 has no external clock sources */
|
||||
static u32 detect_input_clocks(const struct echoaudio *chip)
|
||||
{
|
||||
return ECHO_CLOCK_BIT_INTERNAL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* The Darla20 has no ASIC. Just do nothing */
|
||||
static int load_asic(struct echoaudio *chip)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int set_sample_rate(struct echoaudio *chip, u32 rate)
|
||||
{
|
||||
u8 clock_state, spdif_status;
|
||||
|
||||
if (wait_handshake(chip))
|
||||
return -EIO;
|
||||
|
||||
switch (rate) {
|
||||
case 44100:
|
||||
clock_state = GD_CLOCK_44;
|
||||
spdif_status = GD_SPDIF_STATUS_44;
|
||||
break;
|
||||
case 48000:
|
||||
clock_state = GD_CLOCK_48;
|
||||
spdif_status = GD_SPDIF_STATUS_48;
|
||||
break;
|
||||
default:
|
||||
clock_state = GD_CLOCK_NOCHANGE;
|
||||
spdif_status = GD_SPDIF_STATUS_NOCHANGE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (chip->clock_state == clock_state)
|
||||
clock_state = GD_CLOCK_NOCHANGE;
|
||||
if (spdif_status == chip->spdif_status)
|
||||
spdif_status = GD_SPDIF_STATUS_NOCHANGE;
|
||||
|
||||
chip->comm_page->sample_rate = cpu_to_le32(rate);
|
||||
chip->comm_page->gd_clock_state = clock_state;
|
||||
chip->comm_page->gd_spdif_status = spdif_status;
|
||||
chip->comm_page->gd_resampler_state = 3; /* magic number - should always be 3 */
|
||||
|
||||
/* Save the new audio state if it changed */
|
||||
if (clock_state != GD_CLOCK_NOCHANGE)
|
||||
chip->clock_state = clock_state;
|
||||
if (spdif_status != GD_SPDIF_STATUS_NOCHANGE)
|
||||
chip->spdif_status = spdif_status;
|
||||
chip->sample_rate = rate;
|
||||
|
||||
clear_handshake(chip);
|
||||
return send_vector(chip, DSP_VC_SET_GD_AUDIO_STATE);
|
||||
}
|
||||
106
sound/pci/echoaudio/darla24.c
Normal file
106
sound/pci/echoaudio/darla24.c
Normal file
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* ALSA driver for Echoaudio soundcards.
|
||||
* Copyright (C) 2003-2004 Giuliano Pochini <pochini@shiny.it>
|
||||
*
|
||||
* 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 of the License.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#define ECHOGALS_FAMILY
|
||||
#define ECHOCARD_DARLA24
|
||||
#define ECHOCARD_NAME "Darla24"
|
||||
#define ECHOCARD_HAS_MONITOR
|
||||
#define ECHOCARD_HAS_INPUT_NOMINAL_LEVEL
|
||||
#define ECHOCARD_HAS_OUTPUT_NOMINAL_LEVEL
|
||||
#define ECHOCARD_HAS_EXTERNAL_CLOCK
|
||||
#define ECHOCARD_HAS_SUPER_INTERLEAVE
|
||||
|
||||
/* Pipe indexes */
|
||||
#define PX_ANALOG_OUT 0 /* 8 */
|
||||
#define PX_DIGITAL_OUT 8 /* 0 */
|
||||
#define PX_ANALOG_IN 8 /* 2 */
|
||||
#define PX_DIGITAL_IN 10 /* 0 */
|
||||
#define PX_NUM 10
|
||||
|
||||
/* Bus indexes */
|
||||
#define BX_ANALOG_OUT 0 /* 8 */
|
||||
#define BX_DIGITAL_OUT 8 /* 0 */
|
||||
#define BX_ANALOG_IN 8 /* 2 */
|
||||
#define BX_DIGITAL_IN 10 /* 0 */
|
||||
#define BX_NUM 10
|
||||
|
||||
|
||||
#include <sound/driver.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/info.h>
|
||||
#include <sound/control.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/asoundef.h>
|
||||
#include <sound/initval.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/atomic.h>
|
||||
#include "echoaudio.h"
|
||||
|
||||
#define FW_DARLA24_DSP 0
|
||||
|
||||
static const struct firmware card_fw[] = {
|
||||
{0, "darla24_dsp.fw"}
|
||||
};
|
||||
|
||||
static struct pci_device_id snd_echo_ids[] = {
|
||||
{0x1057, 0x1801, 0xECC0, 0x0040, 0, 0, 0}, /* DSP 56301 Darla24 rev.0 */
|
||||
{0x1057, 0x1801, 0xECC0, 0x0041, 0, 0, 0}, /* DSP 56301 Darla24 rev.1 */
|
||||
{0,}
|
||||
};
|
||||
|
||||
static struct snd_pcm_hardware pcm_hardware_skel = {
|
||||
.info = SNDRV_PCM_INFO_MMAP |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_BLOCK_TRANSFER |
|
||||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_PAUSE |
|
||||
SNDRV_PCM_INFO_SYNC_START,
|
||||
.formats = SNDRV_PCM_FMTBIT_U8 |
|
||||
SNDRV_PCM_FMTBIT_S16_LE |
|
||||
SNDRV_PCM_FMTBIT_S24_3LE |
|
||||
SNDRV_PCM_FMTBIT_S32_LE |
|
||||
SNDRV_PCM_FMTBIT_S32_BE,
|
||||
.rates = SNDRV_PCM_RATE_8000_48000 |
|
||||
SNDRV_PCM_RATE_88200 |
|
||||
SNDRV_PCM_RATE_96000,
|
||||
.rate_min = 8000,
|
||||
.rate_max = 96000,
|
||||
.channels_min = 1,
|
||||
.channels_max = 8,
|
||||
.buffer_bytes_max = 262144,
|
||||
.period_bytes_min = 32,
|
||||
.period_bytes_max = 131072,
|
||||
.periods_min = 2,
|
||||
.periods_max = 220,
|
||||
/* One page (4k) contains 512 instructions. I don't know if the hw
|
||||
supports lists longer than this. In this case periods_max=220 is a
|
||||
safe limit to make sure the list never exceeds 512 instructions. */
|
||||
};
|
||||
|
||||
|
||||
#include "darla24_dsp.c"
|
||||
#include "echoaudio_dsp.c"
|
||||
#include "echoaudio.c"
|
||||
156
sound/pci/echoaudio/darla24_dsp.c
Normal file
156
sound/pci/echoaudio/darla24_dsp.c
Normal file
@@ -0,0 +1,156 @@
|
||||
/***************************************************************************
|
||||
|
||||
Copyright Echo Digital Audio Corporation (c) 1998 - 2004
|
||||
All rights reserved
|
||||
www.echoaudio.com
|
||||
|
||||
This file is part of Echo Digital Audio's generic driver library.
|
||||
|
||||
Echo Digital Audio's generic driver library 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.
|
||||
|
||||
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.
|
||||
|
||||
*************************************************************************
|
||||
|
||||
Translation from C++ and adaptation for use in ALSA-Driver
|
||||
were made by Giuliano Pochini <pochini@shiny.it>
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
{
|
||||
int err;
|
||||
|
||||
DE_INIT(("init_hw() - Darla24\n"));
|
||||
snd_assert((subdevice_id & 0xfff0) == DARLA24, return -ENODEV);
|
||||
|
||||
if ((err = init_dsp_comm_page(chip))) {
|
||||
DE_INIT(("init_hw - could not initialize DSP comm page\n"));
|
||||
return err;
|
||||
}
|
||||
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->dsp_code_to_load = &card_fw[FW_DARLA24_DSP];
|
||||
/* Since this card has no ASIC, mark it as loaded so everything
|
||||
works OK */
|
||||
chip->asic_loaded = TRUE;
|
||||
chip->input_clock_types = ECHO_CLOCK_BIT_INTERNAL |
|
||||
ECHO_CLOCK_BIT_ESYNC;
|
||||
|
||||
if ((err = load_firmware(chip)) < 0)
|
||||
return err;
|
||||
chip->bad_board = FALSE;
|
||||
|
||||
if ((err = init_line_levels(chip)) < 0)
|
||||
return err;
|
||||
|
||||
DE_INIT(("init_hw done\n"));
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static u32 detect_input_clocks(const struct echoaudio *chip)
|
||||
{
|
||||
u32 clocks_from_dsp, clock_bits;
|
||||
|
||||
/* Map the DSP clock detect bits to the generic driver clock
|
||||
detect bits */
|
||||
clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
|
||||
|
||||
clock_bits = ECHO_CLOCK_BIT_INTERNAL;
|
||||
|
||||
if (clocks_from_dsp & GLDM_CLOCK_DETECT_BIT_ESYNC)
|
||||
clock_bits |= ECHO_CLOCK_BIT_ESYNC;
|
||||
|
||||
return clock_bits;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* The Darla24 has no ASIC. Just do nothing */
|
||||
static int load_asic(struct echoaudio *chip)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int set_sample_rate(struct echoaudio *chip, u32 rate)
|
||||
{
|
||||
u8 clock;
|
||||
|
||||
switch (rate) {
|
||||
case 96000:
|
||||
clock = GD24_96000;
|
||||
break;
|
||||
case 88200:
|
||||
clock = GD24_88200;
|
||||
break;
|
||||
case 48000:
|
||||
clock = GD24_48000;
|
||||
break;
|
||||
case 44100:
|
||||
clock = GD24_44100;
|
||||
break;
|
||||
case 32000:
|
||||
clock = GD24_32000;
|
||||
break;
|
||||
case 22050:
|
||||
clock = GD24_22050;
|
||||
break;
|
||||
case 16000:
|
||||
clock = GD24_16000;
|
||||
break;
|
||||
case 11025:
|
||||
clock = GD24_11025;
|
||||
break;
|
||||
case 8000:
|
||||
clock = GD24_8000;
|
||||
break;
|
||||
default:
|
||||
DE_ACT(("set_sample_rate: Error, invalid sample rate %d\n",
|
||||
rate));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (wait_handshake(chip))
|
||||
return -EIO;
|
||||
|
||||
DE_ACT(("set_sample_rate: %d clock %d\n", rate, clock));
|
||||
chip->sample_rate = rate;
|
||||
|
||||
/* Override the sample rate if this card is set to Echo sync. */
|
||||
if (chip->input_clock == ECHO_CLOCK_ESYNC)
|
||||
clock = GD24_EXT_SYNC;
|
||||
|
||||
chip->comm_page->sample_rate = cpu_to_le32(rate); /* ignored by the DSP ? */
|
||||
chip->comm_page->gd_clock_state = clock;
|
||||
clear_handshake(chip);
|
||||
return send_vector(chip, DSP_VC_SET_GD_AUDIO_STATE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int set_input_clock(struct echoaudio *chip, u16 clock)
|
||||
{
|
||||
snd_assert(clock == ECHO_CLOCK_INTERNAL ||
|
||||
clock == ECHO_CLOCK_ESYNC, return -EINVAL);
|
||||
chip->input_clock = clock;
|
||||
return set_sample_rate(chip, chip->sample_rate);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user