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

Commit ffb29b42 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
parents d22af68b 61074c1a
Loading
Loading
Loading
Loading
+21 −19
Original line number Diff line number Diff line
@@ -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 */
+89 −68
Original line number Diff line number Diff line
@@ -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) {
+7 −0
Original line number Diff line number Diff line
@@ -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 */
+6 −1
Original line number Diff line number Diff line
@@ -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,6 +4555,7 @@ static int ca0132_init(struct hda_codec *codec)
	struct auto_pin_cfg *cfg = &spec->autocfg;
	int i;

	if (spec->dsp_state != DSP_DOWNLOAD_FAILED)
		spec->dsp_state = DSP_DOWNLOAD_INIT;
	spec->curr_chip_addx = INVALID_CHIP_ADDRESS;

@@ -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;

+47 −0
Original line number Diff line number Diff line
@@ -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, &amp_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");

Loading