sound fixes for 3.17-rc1
Here is the additional fix patches that have been queued up since the previous pull request. A few HD-audio fixes, a USB-audio quirk addition, and a couple of trivial cleanup for the legacy OSS codes. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABAgAGBQJT7hqWAAoJEGwxgFQ9KSmk5T8P/3aWFguhkpcK9PKCYB+93XAD 04f+fyRXEGHiU6+bvEy3NhC3cRp9++cQteRrzFfFLKoT2zCEKwP3fCJhuls7YWpg CQUa4ojjqJ0E7dMcCHDxY6efFaDQKwmvu7j4VURegv97O5c7mcosxdMzI+FF5Osf r/LbOjrpUNMFCFFKdRdU+Y0Msm+BspVt9FqI7Q7ge0GRQprtL21QcnOO2CGQ27lW UOvRRqUuS5ePAbqlXH0o39awPqEvScK+dWmMKEvamLCbwKp8dPtlClfch4B5qofx ZdS3nPEyayc10gl49k12qfJop6v2GrVfx/uwW0L6b+yELAmoX4dLBku2Zuw2XL/E roRA5ZXf4Z0tQVxdYvCTlMlsTDB6WOD9icBoOvSdpnyCT67PGxeTWDzOcTXjZtbv d+tLC+QpeH3RWzcHPe7PQEe8TOql2uRLwj2MSbzVT45MJdWIY45KoBtzoy15YPIm RVPgSdNpomQXOFx+MFv4OjljaI2xeMZadf4pSTV52U1Kkaf+AvAKT0hS7p+dFtUo pb1NLKBSj996Ayub211thziISTwzNQpCWrqLqafHpt7XDkNEjygJPNV9Q0j6fmbd O+XWw2OiHSbh/SPzRrAoIE0sH2+45+BZcrkwMHD1QMFYyYQ+y1Rpdy0UKPnKKO0c Oj4W21IY0I19gtq1jBAa =UPFy -----END PGP SIGNATURE----- Merge tag 'sound-fix-3.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Here is the additional fix patches that have been queued up since the previous pull request. A few HD-audio fixes, a USB-audio quirk addition, and a couple of trivial cleanup for the legacy OSS codes" * tag 'sound-fix-3.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda - Set TLV_DB_SCALE_MUTE bit for cx5051 vmaster ALSA: hda/ca0132 - Don't try loading firmware at resume when already failed ALSA: hda - Fix pop noises on reboot for Dell XPS 13 9333 ALSA: hda - Set internal mic as default input source on Dell XPS 13 9333 ALSA: usb-audio: fix BOSS ME-25 MIDI regression ALSA: hda - Fix parsing of CMI8888 codec ALSA: hda - Fix probing and stuttering on CMI8888 HD-audio controller ALSA: hda/realtek - Fixed ALC286/ALC288 recording delay for Headset Mic sound: oss: Remove typedefs wanc_info and wavnc_port_info sound: oss: uart401: Remove typedef uart401_devc
This commit is contained in:
commit
ffb29b4227
8 changed files with 239 additions and 89 deletions
|
@ -30,7 +30,7 @@
|
|||
|
||||
#include "mpu401.h"
|
||||
|
||||
typedef struct uart401_devc
|
||||
struct uart401_devc
|
||||
{
|
||||
int base;
|
||||
int irq;
|
||||
|
@ -41,14 +41,13 @@ typedef struct uart401_devc
|
|||
int my_dev;
|
||||
int share_irq;
|
||||
spinlock_t lock;
|
||||
}
|
||||
uart401_devc;
|
||||
};
|
||||
|
||||
#define DATAPORT (devc->base)
|
||||
#define COMDPORT (devc->base+1)
|
||||
#define STATPORT (devc->base+1)
|
||||
|
||||
static int uart401_status(uart401_devc * devc)
|
||||
static int uart401_status(struct uart401_devc *devc)
|
||||
{
|
||||
return inb(STATPORT);
|
||||
}
|
||||
|
@ -56,17 +55,17 @@ static int uart401_status(uart401_devc * devc)
|
|||
#define input_avail(devc) (!(uart401_status(devc)&INPUT_AVAIL))
|
||||
#define output_ready(devc) (!(uart401_status(devc)&OUTPUT_READY))
|
||||
|
||||
static void uart401_cmd(uart401_devc * devc, unsigned char cmd)
|
||||
static void uart401_cmd(struct uart401_devc *devc, unsigned char cmd)
|
||||
{
|
||||
outb((cmd), COMDPORT);
|
||||
}
|
||||
|
||||
static int uart401_read(uart401_devc * devc)
|
||||
static int uart401_read(struct uart401_devc *devc)
|
||||
{
|
||||
return inb(DATAPORT);
|
||||
}
|
||||
|
||||
static void uart401_write(uart401_devc * devc, unsigned char byte)
|
||||
static void uart401_write(struct uart401_devc *devc, unsigned char byte)
|
||||
{
|
||||
outb((byte), DATAPORT);
|
||||
}
|
||||
|
@ -77,10 +76,10 @@ static void uart401_write(uart401_devc * devc, unsigned char byte)
|
|||
#define MPU_RESET 0xFF
|
||||
#define UART_MODE_ON 0x3F
|
||||
|
||||
static int reset_uart401(uart401_devc * devc);
|
||||
static void enter_uart_mode(uart401_devc * devc);
|
||||
static int reset_uart401(struct uart401_devc *devc);
|
||||
static void enter_uart_mode(struct uart401_devc *devc);
|
||||
|
||||
static void uart401_input_loop(uart401_devc * devc)
|
||||
static void uart401_input_loop(struct uart401_devc *devc)
|
||||
{
|
||||
int work_limit=30000;
|
||||
|
||||
|
@ -99,7 +98,7 @@ static void uart401_input_loop(uart401_devc * devc)
|
|||
|
||||
irqreturn_t uart401intr(int irq, void *dev_id)
|
||||
{
|
||||
uart401_devc *devc = dev_id;
|
||||
struct uart401_devc *devc = dev_id;
|
||||
|
||||
if (devc == NULL)
|
||||
{
|
||||
|
@ -118,7 +117,8 @@ uart401_open(int dev, int mode,
|
|||
void (*output) (int dev)
|
||||
)
|
||||
{
|
||||
uart401_devc *devc = (uart401_devc *) midi_devs[dev]->devc;
|
||||
struct uart401_devc *devc = (struct uart401_devc *)
|
||||
midi_devs[dev]->devc;
|
||||
|
||||
if (devc->opened)
|
||||
return -EBUSY;
|
||||
|
@ -138,7 +138,8 @@ uart401_open(int dev, int mode,
|
|||
|
||||
static void uart401_close(int dev)
|
||||
{
|
||||
uart401_devc *devc = (uart401_devc *) midi_devs[dev]->devc;
|
||||
struct uart401_devc *devc = (struct uart401_devc *)
|
||||
midi_devs[dev]->devc;
|
||||
|
||||
reset_uart401(devc);
|
||||
devc->opened = 0;
|
||||
|
@ -148,7 +149,8 @@ static int uart401_out(int dev, unsigned char midi_byte)
|
|||
{
|
||||
int timeout;
|
||||
unsigned long flags;
|
||||
uart401_devc *devc = (uart401_devc *) midi_devs[dev]->devc;
|
||||
struct uart401_devc *devc = (struct uart401_devc *)
|
||||
midi_devs[dev]->devc;
|
||||
|
||||
if (devc->disabled)
|
||||
return 1;
|
||||
|
@ -219,7 +221,7 @@ static const struct midi_operations uart401_operations =
|
|||
.buffer_status = uart401_buffer_status,
|
||||
};
|
||||
|
||||
static void enter_uart_mode(uart401_devc * devc)
|
||||
static void enter_uart_mode(struct uart401_devc *devc)
|
||||
{
|
||||
int ok, timeout;
|
||||
unsigned long flags;
|
||||
|
@ -241,7 +243,7 @@ static void enter_uart_mode(uart401_devc * devc)
|
|||
spin_unlock_irqrestore(&devc->lock,flags);
|
||||
}
|
||||
|
||||
static int reset_uart401(uart401_devc * devc)
|
||||
static int reset_uart401(struct uart401_devc *devc)
|
||||
{
|
||||
int ok, timeout, n;
|
||||
|
||||
|
@ -285,7 +287,7 @@ static int reset_uart401(uart401_devc * devc)
|
|||
|
||||
int probe_uart401(struct address_info *hw_config, struct module *owner)
|
||||
{
|
||||
uart401_devc *devc;
|
||||
struct uart401_devc *devc;
|
||||
char *name = "MPU-401 (UART) MIDI";
|
||||
int ok = 0;
|
||||
unsigned long flags;
|
||||
|
@ -300,7 +302,7 @@ int probe_uart401(struct address_info *hw_config, struct module *owner)
|
|||
return 0;
|
||||
}
|
||||
|
||||
devc = kmalloc(sizeof(uart401_devc), GFP_KERNEL);
|
||||
devc = kmalloc(sizeof(struct uart401_devc), GFP_KERNEL);
|
||||
if (!devc) {
|
||||
printk(KERN_WARNING "uart401: Can't allocate memory\n");
|
||||
goto cleanup_region;
|
||||
|
@ -392,7 +394,7 @@ int probe_uart401(struct address_info *hw_config, struct module *owner)
|
|||
|
||||
void unload_uart401(struct address_info *hw_config)
|
||||
{
|
||||
uart401_devc *devc;
|
||||
struct uart401_devc *devc;
|
||||
int n=hw_config->slots[4];
|
||||
|
||||
/* Not set up */
|
||||
|
|
|
@ -92,7 +92,7 @@ static unsigned short levels[SOUND_MIXER_NRDEVICES] = {
|
|||
0x0000 /* Monitor */
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct wavnc_info {
|
||||
struct address_info hw; /* hardware */
|
||||
char *chip_name;
|
||||
|
||||
|
@ -119,7 +119,7 @@ typedef struct {
|
|||
unsigned int line_mute_state :1;/* set by ioctl or autoselect */
|
||||
unsigned int use_slider :1;/* use slider setting for o/p vol */
|
||||
#endif
|
||||
} wavnc_info;
|
||||
};
|
||||
|
||||
/*
|
||||
* This is the implementation specific mixer information.
|
||||
|
@ -129,29 +129,30 @@ struct waveartist_mixer_info {
|
|||
unsigned int recording_devs; /* Recordable devies */
|
||||
unsigned int stereo_devs; /* Stereo devices */
|
||||
|
||||
unsigned int (*select_input)(wavnc_info *, unsigned int,
|
||||
unsigned int (*select_input)(struct wavnc_info *, unsigned int,
|
||||
unsigned char *, unsigned char *);
|
||||
int (*decode_mixer)(wavnc_info *, int,
|
||||
int (*decode_mixer)(struct wavnc_info *, int,
|
||||
unsigned char, unsigned char);
|
||||
int (*get_mixer)(wavnc_info *, int);
|
||||
int (*get_mixer)(struct wavnc_info *, int);
|
||||
};
|
||||
|
||||
typedef struct wavnc_port_info {
|
||||
struct wavnc_port_info {
|
||||
int open_mode;
|
||||
int speed;
|
||||
int channels;
|
||||
int audio_format;
|
||||
} wavnc_port_info;
|
||||
};
|
||||
|
||||
static int nr_waveartist_devs;
|
||||
static wavnc_info adev_info[MAX_AUDIO_DEV];
|
||||
static struct wavnc_info adev_info[MAX_AUDIO_DEV];
|
||||
static DEFINE_SPINLOCK(waveartist_lock);
|
||||
|
||||
#ifndef CONFIG_ARCH_NETWINDER
|
||||
#define machine_is_netwinder() 0
|
||||
#else
|
||||
static struct timer_list vnc_timer;
|
||||
static void vnc_configure_mixer(wavnc_info *devc, unsigned int input_mask);
|
||||
static void vnc_configure_mixer(struct wavnc_info *devc,
|
||||
unsigned int input_mask);
|
||||
static int vnc_private_ioctl(int dev, unsigned int cmd, int __user *arg);
|
||||
static void vnc_slider_tick(unsigned long data);
|
||||
#endif
|
||||
|
@ -169,7 +170,7 @@ waveartist_set_ctlr(struct address_info *hw, unsigned char clear, unsigned char
|
|||
/* Toggle IRQ acknowledge line
|
||||
*/
|
||||
static inline void
|
||||
waveartist_iack(wavnc_info *devc)
|
||||
waveartist_iack(struct wavnc_info *devc)
|
||||
{
|
||||
unsigned int ctlr_port = devc->hw.io_base + CTLR;
|
||||
int old_ctlr;
|
||||
|
@ -188,7 +189,7 @@ waveartist_sleep(int timeout_ms)
|
|||
}
|
||||
|
||||
static int
|
||||
waveartist_reset(wavnc_info *devc)
|
||||
waveartist_reset(struct wavnc_info *devc)
|
||||
{
|
||||
struct address_info *hw = &devc->hw;
|
||||
unsigned int timeout, res = -1;
|
||||
|
@ -223,7 +224,7 @@ waveartist_reset(wavnc_info *devc)
|
|||
* and can send or receive multiple words.
|
||||
*/
|
||||
static int
|
||||
waveartist_cmd(wavnc_info *devc,
|
||||
waveartist_cmd(struct wavnc_info *devc,
|
||||
int nr_cmd, unsigned int *cmd,
|
||||
int nr_resp, unsigned int *resp)
|
||||
{
|
||||
|
@ -299,7 +300,7 @@ waveartist_cmd(wavnc_info *devc,
|
|||
* Send one command word
|
||||
*/
|
||||
static inline int
|
||||
waveartist_cmd1(wavnc_info *devc, unsigned int cmd)
|
||||
waveartist_cmd1(struct wavnc_info *devc, unsigned int cmd)
|
||||
{
|
||||
return waveartist_cmd(devc, 1, &cmd, 0, NULL);
|
||||
}
|
||||
|
@ -308,7 +309,7 @@ waveartist_cmd1(wavnc_info *devc, unsigned int cmd)
|
|||
* Send one command, receive one word
|
||||
*/
|
||||
static inline unsigned int
|
||||
waveartist_cmd1_r(wavnc_info *devc, unsigned int cmd)
|
||||
waveartist_cmd1_r(struct wavnc_info *devc, unsigned int cmd)
|
||||
{
|
||||
unsigned int ret;
|
||||
|
||||
|
@ -322,7 +323,7 @@ waveartist_cmd1_r(wavnc_info *devc, unsigned int cmd)
|
|||
* word (and throw it away)
|
||||
*/
|
||||
static inline int
|
||||
waveartist_cmd2(wavnc_info *devc, unsigned int cmd, unsigned int arg)
|
||||
waveartist_cmd2(struct wavnc_info *devc, unsigned int cmd, unsigned int arg)
|
||||
{
|
||||
unsigned int vals[2];
|
||||
|
||||
|
@ -336,7 +337,7 @@ waveartist_cmd2(wavnc_info *devc, unsigned int cmd, unsigned int arg)
|
|||
* Send a triple command
|
||||
*/
|
||||
static inline int
|
||||
waveartist_cmd3(wavnc_info *devc, unsigned int cmd,
|
||||
waveartist_cmd3(struct wavnc_info *devc, unsigned int cmd,
|
||||
unsigned int arg1, unsigned int arg2)
|
||||
{
|
||||
unsigned int vals[3];
|
||||
|
@ -349,7 +350,7 @@ waveartist_cmd3(wavnc_info *devc, unsigned int cmd,
|
|||
}
|
||||
|
||||
static int
|
||||
waveartist_getrev(wavnc_info *devc, char *rev)
|
||||
waveartist_getrev(struct wavnc_info *devc, char *rev)
|
||||
{
|
||||
unsigned int temp[2];
|
||||
unsigned int cmd = WACMD_GETREV;
|
||||
|
@ -371,15 +372,15 @@ static void waveartist_trigger(int dev, int state);
|
|||
static int
|
||||
waveartist_open(int dev, int mode)
|
||||
{
|
||||
wavnc_info *devc;
|
||||
wavnc_port_info *portc;
|
||||
struct wavnc_info *devc;
|
||||
struct wavnc_port_info *portc;
|
||||
unsigned long flags;
|
||||
|
||||
if (dev < 0 || dev >= num_audiodevs)
|
||||
return -ENXIO;
|
||||
|
||||
devc = (wavnc_info *) audio_devs[dev]->devc;
|
||||
portc = (wavnc_port_info *) audio_devs[dev]->portc;
|
||||
devc = (struct wavnc_info *) audio_devs[dev]->devc;
|
||||
portc = (struct wavnc_port_info *) audio_devs[dev]->portc;
|
||||
|
||||
spin_lock_irqsave(&waveartist_lock, flags);
|
||||
if (portc->open_mode || (devc->open_mode & mode)) {
|
||||
|
@ -404,8 +405,10 @@ waveartist_open(int dev, int mode)
|
|||
static void
|
||||
waveartist_close(int dev)
|
||||
{
|
||||
wavnc_info *devc = (wavnc_info *) audio_devs[dev]->devc;
|
||||
wavnc_port_info *portc = (wavnc_port_info *) audio_devs[dev]->portc;
|
||||
struct wavnc_info *devc = (struct wavnc_info *)
|
||||
audio_devs[dev]->devc;
|
||||
struct wavnc_port_info *portc = (struct wavnc_port_info *)
|
||||
audio_devs[dev]->portc;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&waveartist_lock, flags);
|
||||
|
@ -422,8 +425,10 @@ waveartist_close(int dev)
|
|||
static void
|
||||
waveartist_output_block(int dev, unsigned long buf, int __count, int intrflag)
|
||||
{
|
||||
wavnc_port_info *portc = (wavnc_port_info *) audio_devs[dev]->portc;
|
||||
wavnc_info *devc = (wavnc_info *) audio_devs[dev]->devc;
|
||||
struct wavnc_port_info *portc = (struct wavnc_port_info *)
|
||||
audio_devs[dev]->portc;
|
||||
struct wavnc_info *devc = (struct wavnc_info *)
|
||||
audio_devs[dev]->devc;
|
||||
unsigned long flags;
|
||||
unsigned int count = __count;
|
||||
|
||||
|
@ -467,8 +472,10 @@ waveartist_output_block(int dev, unsigned long buf, int __count, int intrflag)
|
|||
static void
|
||||
waveartist_start_input(int dev, unsigned long buf, int __count, int intrflag)
|
||||
{
|
||||
wavnc_port_info *portc = (wavnc_port_info *) audio_devs[dev]->portc;
|
||||
wavnc_info *devc = (wavnc_info *) audio_devs[dev]->devc;
|
||||
struct wavnc_port_info *portc = (struct wavnc_port_info *)
|
||||
audio_devs[dev]->portc;
|
||||
struct wavnc_info *devc = (struct wavnc_info *)
|
||||
audio_devs[dev]->devc;
|
||||
unsigned long flags;
|
||||
unsigned int count = __count;
|
||||
|
||||
|
@ -514,7 +521,7 @@ waveartist_ioctl(int dev, unsigned int cmd, void __user * arg)
|
|||
}
|
||||
|
||||
static unsigned int
|
||||
waveartist_get_speed(wavnc_port_info *portc)
|
||||
waveartist_get_speed(struct wavnc_port_info *portc)
|
||||
{
|
||||
unsigned int speed;
|
||||
|
||||
|
@ -542,7 +549,7 @@ waveartist_get_speed(wavnc_port_info *portc)
|
|||
}
|
||||
|
||||
static unsigned int
|
||||
waveartist_get_bits(wavnc_port_info *portc)
|
||||
waveartist_get_bits(struct wavnc_port_info *portc)
|
||||
{
|
||||
unsigned int bits;
|
||||
|
||||
|
@ -560,8 +567,10 @@ static int
|
|||
waveartist_prepare_for_input(int dev, int bsize, int bcount)
|
||||
{
|
||||
unsigned long flags;
|
||||
wavnc_info *devc = (wavnc_info *) audio_devs[dev]->devc;
|
||||
wavnc_port_info *portc = (wavnc_port_info *) audio_devs[dev]->portc;
|
||||
struct wavnc_info *devc = (struct wavnc_info *)
|
||||
audio_devs[dev]->devc;
|
||||
struct wavnc_port_info *portc = (struct wavnc_port_info *)
|
||||
audio_devs[dev]->portc;
|
||||
unsigned int speed, bits;
|
||||
|
||||
if (devc->audio_mode)
|
||||
|
@ -615,8 +624,10 @@ static int
|
|||
waveartist_prepare_for_output(int dev, int bsize, int bcount)
|
||||
{
|
||||
unsigned long flags;
|
||||
wavnc_info *devc = (wavnc_info *) audio_devs[dev]->devc;
|
||||
wavnc_port_info *portc = (wavnc_port_info *) audio_devs[dev]->portc;
|
||||
struct wavnc_info *devc = (struct wavnc_info *)
|
||||
audio_devs[dev]->devc;
|
||||
struct wavnc_port_info *portc = (struct wavnc_port_info *)
|
||||
audio_devs[dev]->portc;
|
||||
unsigned int speed, bits;
|
||||
|
||||
/*
|
||||
|
@ -660,8 +671,9 @@ waveartist_prepare_for_output(int dev, int bsize, int bcount)
|
|||
static void
|
||||
waveartist_halt(int dev)
|
||||
{
|
||||
wavnc_port_info *portc = (wavnc_port_info *) audio_devs[dev]->portc;
|
||||
wavnc_info *devc;
|
||||
struct wavnc_port_info *portc = (struct wavnc_port_info *)
|
||||
audio_devs[dev]->portc;
|
||||
struct wavnc_info *devc;
|
||||
|
||||
if (portc->open_mode & OPEN_WRITE)
|
||||
waveartist_halt_output(dev);
|
||||
|
@ -669,14 +681,15 @@ waveartist_halt(int dev)
|
|||
if (portc->open_mode & OPEN_READ)
|
||||
waveartist_halt_input(dev);
|
||||
|
||||
devc = (wavnc_info *) audio_devs[dev]->devc;
|
||||
devc = (struct wavnc_info *) audio_devs[dev]->devc;
|
||||
devc->audio_mode = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
waveartist_halt_input(int dev)
|
||||
{
|
||||
wavnc_info *devc = (wavnc_info *) audio_devs[dev]->devc;
|
||||
struct wavnc_info *devc = (struct wavnc_info *)
|
||||
audio_devs[dev]->devc;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&waveartist_lock, flags);
|
||||
|
@ -703,7 +716,8 @@ waveartist_halt_input(int dev)
|
|||
static void
|
||||
waveartist_halt_output(int dev)
|
||||
{
|
||||
wavnc_info *devc = (wavnc_info *) audio_devs[dev]->devc;
|
||||
struct wavnc_info *devc = (struct wavnc_info *)
|
||||
audio_devs[dev]->devc;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&waveartist_lock, flags);
|
||||
|
@ -727,8 +741,10 @@ waveartist_halt_output(int dev)
|
|||
static void
|
||||
waveartist_trigger(int dev, int state)
|
||||
{
|
||||
wavnc_info *devc = (wavnc_info *) audio_devs[dev]->devc;
|
||||
wavnc_port_info *portc = (wavnc_port_info *) audio_devs[dev]->portc;
|
||||
struct wavnc_info *devc = (struct wavnc_info *)
|
||||
audio_devs[dev]->devc;
|
||||
struct wavnc_port_info *portc = (struct wavnc_port_info *)
|
||||
audio_devs[dev]->portc;
|
||||
unsigned long flags;
|
||||
|
||||
if (debug_flg & DEBUG_TRIGGER) {
|
||||
|
@ -764,7 +780,8 @@ waveartist_trigger(int dev, int state)
|
|||
static int
|
||||
waveartist_set_speed(int dev, int arg)
|
||||
{
|
||||
wavnc_port_info *portc = (wavnc_port_info *) audio_devs[dev]->portc;
|
||||
struct wavnc_port_info *portc = (struct wavnc_port_info *)
|
||||
audio_devs[dev]->portc;
|
||||
|
||||
if (arg <= 0)
|
||||
return portc->speed;
|
||||
|
@ -782,7 +799,8 @@ waveartist_set_speed(int dev, int arg)
|
|||
static short
|
||||
waveartist_set_channels(int dev, short arg)
|
||||
{
|
||||
wavnc_port_info *portc = (wavnc_port_info *) audio_devs[dev]->portc;
|
||||
struct wavnc_port_info *portc = (struct wavnc_port_info *)
|
||||
audio_devs[dev]->portc;
|
||||
|
||||
if (arg != 1 && arg != 2)
|
||||
return portc->channels;
|
||||
|
@ -794,7 +812,8 @@ waveartist_set_channels(int dev, short arg)
|
|||
static unsigned int
|
||||
waveartist_set_bits(int dev, unsigned int arg)
|
||||
{
|
||||
wavnc_port_info *portc = (wavnc_port_info *) audio_devs[dev]->portc;
|
||||
struct wavnc_port_info *portc = (struct wavnc_port_info *)
|
||||
audio_devs[dev]->portc;
|
||||
|
||||
if (arg == 0)
|
||||
return portc->audio_format;
|
||||
|
@ -829,7 +848,7 @@ static struct audio_driver waveartist_audio_driver = {
|
|||
static irqreturn_t
|
||||
waveartist_intr(int irq, void *dev_id)
|
||||
{
|
||||
wavnc_info *devc = dev_id;
|
||||
struct wavnc_info *devc = dev_id;
|
||||
int irqstatus, status;
|
||||
|
||||
spin_lock(&waveartist_lock);
|
||||
|
@ -912,7 +931,7 @@ static const struct mix_ent mix_devs[SOUND_MIXER_NRDEVICES] = {
|
|||
};
|
||||
|
||||
static void
|
||||
waveartist_mixer_update(wavnc_info *devc, int whichDev)
|
||||
waveartist_mixer_update(struct wavnc_info *devc, int whichDev)
|
||||
{
|
||||
unsigned int lev_left, lev_right;
|
||||
|
||||
|
@ -973,7 +992,8 @@ waveartist_mixer_update(wavnc_info *devc, int whichDev)
|
|||
* relevant *_select_input function has done that for us.
|
||||
*/
|
||||
static void
|
||||
waveartist_set_adc_mux(wavnc_info *devc, char left_dev, char right_dev)
|
||||
waveartist_set_adc_mux(struct wavnc_info *devc, char left_dev,
|
||||
char right_dev)
|
||||
{
|
||||
unsigned int reg_08, reg_09;
|
||||
|
||||
|
@ -996,7 +1016,7 @@ waveartist_set_adc_mux(wavnc_info *devc, char left_dev, char right_dev)
|
|||
* SOUND_MASK_MIC Mic Microphone
|
||||
*/
|
||||
static unsigned int
|
||||
waveartist_select_input(wavnc_info *devc, unsigned int recmask,
|
||||
waveartist_select_input(struct wavnc_info *devc, unsigned int recmask,
|
||||
unsigned char *dev_l, unsigned char *dev_r)
|
||||
{
|
||||
unsigned int recdev = ADC_MUX_NONE;
|
||||
|
@ -1024,7 +1044,8 @@ waveartist_select_input(wavnc_info *devc, unsigned int recmask,
|
|||
}
|
||||
|
||||
static int
|
||||
waveartist_decode_mixer(wavnc_info *devc, int dev, unsigned char lev_l,
|
||||
waveartist_decode_mixer(struct wavnc_info *devc, int dev,
|
||||
unsigned char lev_l,
|
||||
unsigned char lev_r)
|
||||
{
|
||||
switch (dev) {
|
||||
|
@ -1050,7 +1071,7 @@ waveartist_decode_mixer(wavnc_info *devc, int dev, unsigned char lev_l,
|
|||
return dev;
|
||||
}
|
||||
|
||||
static int waveartist_get_mixer(wavnc_info *devc, int dev)
|
||||
static int waveartist_get_mixer(struct wavnc_info *devc, int dev)
|
||||
{
|
||||
return devc->levels[dev];
|
||||
}
|
||||
|
@ -1068,7 +1089,7 @@ static const struct waveartist_mixer_info waveartist_mixer = {
|
|||
};
|
||||
|
||||
static void
|
||||
waveartist_set_recmask(wavnc_info *devc, unsigned int recmask)
|
||||
waveartist_set_recmask(struct wavnc_info *devc, unsigned int recmask)
|
||||
{
|
||||
unsigned char dev_l, dev_r;
|
||||
|
||||
|
@ -1092,7 +1113,7 @@ waveartist_set_recmask(wavnc_info *devc, unsigned int recmask)
|
|||
}
|
||||
|
||||
static int
|
||||
waveartist_set_mixer(wavnc_info *devc, int dev, unsigned int level)
|
||||
waveartist_set_mixer(struct wavnc_info *devc, int dev, unsigned int level)
|
||||
{
|
||||
unsigned int lev_left = level & 0x00ff;
|
||||
unsigned int lev_right = (level & 0xff00) >> 8;
|
||||
|
@ -1120,7 +1141,7 @@ waveartist_set_mixer(wavnc_info *devc, int dev, unsigned int level)
|
|||
static int
|
||||
waveartist_mixer_ioctl(int dev, unsigned int cmd, void __user * arg)
|
||||
{
|
||||
wavnc_info *devc = (wavnc_info *)audio_devs[dev]->devc;
|
||||
struct wavnc_info *devc = (struct wavnc_info *)audio_devs[dev]->devc;
|
||||
int ret = 0, val, nr;
|
||||
|
||||
/*
|
||||
|
@ -1204,7 +1225,7 @@ static struct mixer_operations waveartist_mixer_operations =
|
|||
};
|
||||
|
||||
static void
|
||||
waveartist_mixer_reset(wavnc_info *devc)
|
||||
waveartist_mixer_reset(struct wavnc_info *devc)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -1241,9 +1262,9 @@ waveartist_mixer_reset(wavnc_info *devc)
|
|||
waveartist_mixer_update(devc, i);
|
||||
}
|
||||
|
||||
static int __init waveartist_init(wavnc_info *devc)
|
||||
static int __init waveartist_init(struct wavnc_info *devc)
|
||||
{
|
||||
wavnc_port_info *portc;
|
||||
struct wavnc_port_info *portc;
|
||||
char rev[3], dev_name[64];
|
||||
int my_dev;
|
||||
|
||||
|
@ -1261,7 +1282,7 @@ static int __init waveartist_init(wavnc_info *devc)
|
|||
conf_printf2(dev_name, devc->hw.io_base, devc->hw.irq,
|
||||
devc->hw.dma, devc->hw.dma2);
|
||||
|
||||
portc = kzalloc(sizeof(wavnc_port_info), GFP_KERNEL);
|
||||
portc = kzalloc(sizeof(struct wavnc_port_info), GFP_KERNEL);
|
||||
if (portc == NULL)
|
||||
goto nomem;
|
||||
|
||||
|
@ -1330,7 +1351,7 @@ static int __init waveartist_init(wavnc_info *devc)
|
|||
|
||||
static int __init probe_waveartist(struct address_info *hw_config)
|
||||
{
|
||||
wavnc_info *devc = &adev_info[nr_waveartist_devs];
|
||||
struct wavnc_info *devc = &adev_info[nr_waveartist_devs];
|
||||
|
||||
if (nr_waveartist_devs >= MAX_AUDIO_DEV) {
|
||||
printk(KERN_WARNING "waveartist: too many audio devices\n");
|
||||
|
@ -1367,7 +1388,7 @@ static int __init probe_waveartist(struct address_info *hw_config)
|
|||
static void __init
|
||||
attach_waveartist(struct address_info *hw, const struct waveartist_mixer_info *mix)
|
||||
{
|
||||
wavnc_info *devc = &adev_info[nr_waveartist_devs];
|
||||
struct wavnc_info *devc = &adev_info[nr_waveartist_devs];
|
||||
|
||||
/*
|
||||
* NOTE! If irq < 0, there is another driver which has allocated the
|
||||
|
@ -1410,7 +1431,7 @@ attach_waveartist(struct address_info *hw, const struct waveartist_mixer_info *m
|
|||
|
||||
static void __exit unload_waveartist(struct address_info *hw)
|
||||
{
|
||||
wavnc_info *devc = NULL;
|
||||
struct wavnc_info *devc = NULL;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nr_waveartist_devs; i++)
|
||||
|
@ -1478,7 +1499,7 @@ static void __exit unload_waveartist(struct address_info *hw)
|
|||
#define VNC_DISABLE_AUTOSWITCH 0x80
|
||||
|
||||
static inline void
|
||||
vnc_mute_spkr(wavnc_info *devc)
|
||||
vnc_mute_spkr(struct wavnc_info *devc)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
|
@ -1488,7 +1509,7 @@ vnc_mute_spkr(wavnc_info *devc)
|
|||
}
|
||||
|
||||
static void
|
||||
vnc_mute_lout(wavnc_info *devc)
|
||||
vnc_mute_lout(struct wavnc_info *devc)
|
||||
{
|
||||
unsigned int left, right;
|
||||
|
||||
|
@ -1507,7 +1528,7 @@ vnc_mute_lout(wavnc_info *devc)
|
|||
}
|
||||
|
||||
static int
|
||||
vnc_volume_slider(wavnc_info *devc)
|
||||
vnc_volume_slider(struct wavnc_info *devc)
|
||||
{
|
||||
static signed int old_slider_volume;
|
||||
unsigned long flags;
|
||||
|
@ -1567,7 +1588,7 @@ vnc_volume_slider(wavnc_info *devc)
|
|||
* SOUND_MASK_MIC Right Mic Builtin microphone
|
||||
*/
|
||||
static unsigned int
|
||||
netwinder_select_input(wavnc_info *devc, unsigned int recmask,
|
||||
netwinder_select_input(struct wavnc_info *devc, unsigned int recmask,
|
||||
unsigned char *dev_l, unsigned char *dev_r)
|
||||
{
|
||||
unsigned int recdev_l = ADC_MUX_NONE, recdev_r = ADC_MUX_NONE;
|
||||
|
@ -1604,7 +1625,7 @@ netwinder_select_input(wavnc_info *devc, unsigned int recmask,
|
|||
}
|
||||
|
||||
static int
|
||||
netwinder_decode_mixer(wavnc_info *devc, int dev, unsigned char lev_l,
|
||||
netwinder_decode_mixer(struct wavnc_info *devc, int dev, unsigned char lev_l,
|
||||
unsigned char lev_r)
|
||||
{
|
||||
switch (dev) {
|
||||
|
@ -1643,7 +1664,7 @@ netwinder_decode_mixer(wavnc_info *devc, int dev, unsigned char lev_l,
|
|||
return dev;
|
||||
}
|
||||
|
||||
static int netwinder_get_mixer(wavnc_info *devc, int dev)
|
||||
static int netwinder_get_mixer(struct wavnc_info *devc, int dev)
|
||||
{
|
||||
int levels;
|
||||
|
||||
|
@ -1703,7 +1724,7 @@ static const struct waveartist_mixer_info netwinder_mixer = {
|
|||
};
|
||||
|
||||
static void
|
||||
vnc_configure_mixer(wavnc_info *devc, unsigned int recmask)
|
||||
vnc_configure_mixer(struct wavnc_info *devc, unsigned int recmask)
|
||||
{
|
||||
if (!devc->no_autoselect) {
|
||||
if (devc->handset_detect) {
|
||||
|
@ -1729,7 +1750,7 @@ vnc_configure_mixer(wavnc_info *devc, unsigned int recmask)
|
|||
}
|
||||
|
||||
static int
|
||||
vnc_slider(wavnc_info *devc)
|
||||
vnc_slider(struct wavnc_info *devc)
|
||||
{
|
||||
signed int slider_volume;
|
||||
unsigned int temp, old_hs, old_td;
|
||||
|
@ -1795,7 +1816,7 @@ vnc_slider_tick(unsigned long data)
|
|||
static int
|
||||
vnc_private_ioctl(int dev, unsigned int cmd, int __user * arg)
|
||||
{
|
||||
wavnc_info *devc = (wavnc_info *)audio_devs[dev]->devc;
|
||||
struct wavnc_info *devc = (struct wavnc_info *)audio_devs[dev]->devc;
|
||||
int val;
|
||||
|
||||
switch (cmd) {
|
||||
|
|
|
@ -265,6 +265,7 @@ enum {
|
|||
AZX_DRIVER_TERA,
|
||||
AZX_DRIVER_CTX,
|
||||
AZX_DRIVER_CTHDA,
|
||||
AZX_DRIVER_CMEDIA,
|
||||
AZX_DRIVER_GENERIC,
|
||||
AZX_NUM_DRIVERS, /* keep this as last entry */
|
||||
};
|
||||
|
@ -330,6 +331,7 @@ static char *driver_short_names[] = {
|
|||
[AZX_DRIVER_TERA] = "HDA Teradici",
|
||||
[AZX_DRIVER_CTX] = "HDA Creative",
|
||||
[AZX_DRIVER_CTHDA] = "HDA Creative",
|
||||
[AZX_DRIVER_CMEDIA] = "HDA C-Media",
|
||||
[AZX_DRIVER_GENERIC] = "HD-Audio Generic",
|
||||
};
|
||||
|
||||
|
@ -1373,6 +1375,7 @@ static void azx_check_snoop_available(struct azx *chip)
|
|||
snoop = false;
|
||||
break;
|
||||
case AZX_DRIVER_CTHDA:
|
||||
case AZX_DRIVER_CMEDIA:
|
||||
snoop = false;
|
||||
break;
|
||||
}
|
||||
|
@ -2154,6 +2157,10 @@ static const struct pci_device_id azx_ids[] = {
|
|||
.driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
|
||||
AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
|
||||
#endif
|
||||
/* CM8888 */
|
||||
{ PCI_DEVICE(0x13f6, 0x5011),
|
||||
.driver_data = AZX_DRIVER_CMEDIA |
|
||||
AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB },
|
||||
/* Vortex86MX */
|
||||
{ PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
|
||||
/* VMware HDAudio */
|
||||
|
|
|
@ -4376,6 +4376,9 @@ static void ca0132_download_dsp(struct hda_codec *codec)
|
|||
return; /* NOP */
|
||||
#endif
|
||||
|
||||
if (spec->dsp_state == DSP_DOWNLOAD_FAILED)
|
||||
return; /* don't retry failures */
|
||||
|
||||
chipio_enable_clocks(codec);
|
||||
spec->dsp_state = DSP_DOWNLOADING;
|
||||
if (!ca0132_download_dsp_images(codec))
|
||||
|
@ -4552,7 +4555,8 @@ static int ca0132_init(struct hda_codec *codec)
|
|||
struct auto_pin_cfg *cfg = &spec->autocfg;
|
||||
int i;
|
||||
|
||||
spec->dsp_state = DSP_DOWNLOAD_INIT;
|
||||
if (spec->dsp_state != DSP_DOWNLOAD_FAILED)
|
||||
spec->dsp_state = DSP_DOWNLOAD_INIT;
|
||||
spec->curr_chip_addx = INVALID_CHIP_ADDRESS;
|
||||
|
||||
snd_hda_power_up(codec);
|
||||
|
@ -4663,6 +4667,7 @@ static int patch_ca0132(struct hda_codec *codec)
|
|||
codec->spec = spec;
|
||||
spec->codec = codec;
|
||||
|
||||
spec->dsp_state = DSP_DOWNLOAD_INIT;
|
||||
spec->num_mixers = 1;
|
||||
spec->mixers[0] = ca0132_mixer;
|
||||
|
||||
|
|
|
@ -75,15 +75,62 @@ static int patch_cmi9880(struct hda_codec *codec)
|
|||
return err;
|
||||
}
|
||||
|
||||
static int patch_cmi8888(struct hda_codec *codec)
|
||||
{
|
||||
struct cmi_spec *spec;
|
||||
struct auto_pin_cfg *cfg;
|
||||
int err;
|
||||
|
||||
spec = kzalloc(sizeof(*spec), GFP_KERNEL);
|
||||
if (!spec)
|
||||
return -ENOMEM;
|
||||
|
||||
codec->spec = spec;
|
||||
cfg = &spec->gen.autocfg;
|
||||
snd_hda_gen_spec_init(&spec->gen);
|
||||
|
||||
/* mask NID 0x10 from the playback volume selection;
|
||||
* it's a headphone boost volume handled manually below
|
||||
*/
|
||||
spec->gen.out_vol_mask = (1ULL << 0x10);
|
||||
|
||||
err = snd_hda_parse_pin_defcfg(codec, cfg, NULL, 0);
|
||||
if (err < 0)
|
||||
goto error;
|
||||
err = snd_hda_gen_parse_auto_config(codec, cfg);
|
||||
if (err < 0)
|
||||
goto error;
|
||||
|
||||
if (get_defcfg_device(snd_hda_codec_get_pincfg(codec, 0x10)) ==
|
||||
AC_JACK_HP_OUT) {
|
||||
static const struct snd_kcontrol_new amp_kctl =
|
||||
HDA_CODEC_VOLUME("Headphone Amp Playback Volume",
|
||||
0x10, 0, HDA_OUTPUT);
|
||||
if (!snd_hda_gen_add_kctl(&spec->gen, NULL, &_kctl)) {
|
||||
err = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
codec->patch_ops = cmi_auto_patch_ops;
|
||||
return 0;
|
||||
|
||||
error:
|
||||
snd_hda_gen_free(codec);
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
* patch entries
|
||||
*/
|
||||
static const struct hda_codec_preset snd_hda_preset_cmedia[] = {
|
||||
{ .id = 0x13f68888, .name = "CMI8888", .patch = patch_cmi8888 },
|
||||
{ .id = 0x13f69880, .name = "CMI9880", .patch = patch_cmi9880 },
|
||||
{ .id = 0x434d4980, .name = "CMI9880", .patch = patch_cmi9880 },
|
||||
{} /* terminator */
|
||||
};
|
||||
|
||||
MODULE_ALIAS("snd-hda-codec-id:13f68888");
|
||||
MODULE_ALIAS("snd-hda-codec-id:13f69880");
|
||||
MODULE_ALIAS("snd-hda-codec-id:434d4980");
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/jack.h>
|
||||
#include <sound/tlv.h>
|
||||
|
||||
#include "hda_codec.h"
|
||||
#include "hda_local.h"
|
||||
|
@ -859,6 +860,11 @@ static int patch_conexant_auto(struct hda_codec *codec)
|
|||
if (err < 0)
|
||||
goto error;
|
||||
|
||||
if (codec->vendor_id == 0x14f15051) {
|
||||
/* minimum value is actually mute */
|
||||
spec->gen.vmaster_tlv[3] |= TLV_DB_SCALE_MUTE;
|
||||
}
|
||||
|
||||
codec->patch_ops = cx_auto_patch_ops;
|
||||
|
||||
/* Some laptops with Conexant chips show stalls in S3 resume,
|
||||
|
|
|
@ -2782,6 +2782,27 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
|
|||
return alc_parse_auto_config(codec, alc269_ignore, ssids);
|
||||
}
|
||||
|
||||
static int find_ext_mic_pin(struct hda_codec *codec);
|
||||
|
||||
static void alc286_shutup(struct hda_codec *codec)
|
||||
{
|
||||
int i;
|
||||
int mic_pin = find_ext_mic_pin(codec);
|
||||
/* don't shut up pins when unloading the driver; otherwise it breaks
|
||||
* the default pin setup at the next load of the driver
|
||||
*/
|
||||
if (codec->bus->shutdown)
|
||||
return;
|
||||
for (i = 0; i < codec->init_pins.used; i++) {
|
||||
struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
|
||||
/* use read here for syncing after issuing each verb */
|
||||
if (pin->nid != mic_pin)
|
||||
snd_hda_codec_read(codec, pin->nid, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
|
||||
}
|
||||
codec->pins_shutup = 1;
|
||||
}
|
||||
|
||||
static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
|
||||
{
|
||||
int val = alc_read_coef_idx(codec, 0x04);
|
||||
|
@ -4072,7 +4093,7 @@ static unsigned int alc_power_filter_xps13(struct hda_codec *codec,
|
|||
|
||||
/* Avoid pop noises when headphones are plugged in */
|
||||
if (spec->gen.hp_jack_present)
|
||||
if (nid == codec->afg || nid == 0x02)
|
||||
if (nid == codec->afg || nid == 0x02 || nid == 0x15)
|
||||
return AC_PWRST_D0;
|
||||
return power_state;
|
||||
}
|
||||
|
@ -4082,8 +4103,19 @@ static void alc_fixup_dell_xps13(struct hda_codec *codec,
|
|||
{
|
||||
if (action == HDA_FIXUP_ACT_PROBE) {
|
||||
struct alc_spec *spec = codec->spec;
|
||||
struct hda_input_mux *imux = &spec->gen.input_mux;
|
||||
int i;
|
||||
|
||||
spec->shutup = alc_no_shutup;
|
||||
codec->power_filter = alc_power_filter_xps13;
|
||||
|
||||
/* Make the internal mic the default input source. */
|
||||
for (i = 0; i < imux->num_items; i++) {
|
||||
if (spec->gen.imux_pins[i] == 0x12) {
|
||||
spec->gen.cur_mux[0] = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5384,6 +5416,7 @@ static int patch_alc269(struct hda_codec *codec)
|
|||
case 0x10ec0286:
|
||||
case 0x10ec0288:
|
||||
spec->codec_variant = ALC269_TYPE_ALC286;
|
||||
spec->shutup = alc286_shutup;
|
||||
break;
|
||||
case 0x10ec0255:
|
||||
spec->codec_variant = ALC269_TYPE_ALC255;
|
||||
|
|
|
@ -1580,6 +1580,35 @@ YAMAHA_DEVICE(0x7010, "UB99"),
|
|||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
/* BOSS ME-25 */
|
||||
USB_DEVICE(0x0582, 0x0113),
|
||||
.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
||||
.ifnum = QUIRK_ANY_INTERFACE,
|
||||
.type = QUIRK_COMPOSITE,
|
||||
.data = (const struct snd_usb_audio_quirk[]) {
|
||||
{
|
||||
.ifnum = 0,
|
||||
.type = QUIRK_AUDIO_STANDARD_INTERFACE
|
||||
},
|
||||
{
|
||||
.ifnum = 1,
|
||||
.type = QUIRK_AUDIO_STANDARD_INTERFACE
|
||||
},
|
||||
{
|
||||
.ifnum = 2,
|
||||
.type = QUIRK_MIDI_FIXED_ENDPOINT,
|
||||
.data = & (const struct snd_usb_midi_endpoint_info) {
|
||||
.out_cables = 0x0001,
|
||||
.in_cables = 0x0001
|
||||
}
|
||||
},
|
||||
{
|
||||
.ifnum = -1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
/* only 44.1 kHz works at the moment */
|
||||
USB_DEVICE(0x0582, 0x0120),
|
||||
|
|
Loading…
Reference in a new issue