Merge branch 'fix/hda' into topic/hda

This commit is contained in:
Takashi Iwai 2011-07-07 09:28:47 +02:00
commit 8e89995c58
8 changed files with 41 additions and 21 deletions

View File

@ -99,7 +99,14 @@ struct snd_sb_csp_info {
/* get CSP information */ /* get CSP information */
#define SNDRV_SB_CSP_IOCTL_INFO _IOR('H', 0x10, struct snd_sb_csp_info) #define SNDRV_SB_CSP_IOCTL_INFO _IOR('H', 0x10, struct snd_sb_csp_info)
/* load microcode to CSP */ /* load microcode to CSP */
#define SNDRV_SB_CSP_IOCTL_LOAD_CODE _IOW('H', 0x11, struct snd_sb_csp_microcode) /* NOTE: struct snd_sb_csp_microcode overflows the max size (13 bits)
* defined for some architectures like MIPS, and it leads to build errors.
* (x86 and co have 14-bit size, thus it's valid, though.)
* As a workaround for skipping the size-limit check, here we don't use the
* normal _IOW() macro but _IOC() with the manual argument.
*/
#define SNDRV_SB_CSP_IOCTL_LOAD_CODE \
_IOC(_IOC_WRITE, 'H', 0x11, sizeof(struct snd_sb_csp_microcode))
/* unload microcode from CSP */ /* unload microcode from CSP */
#define SNDRV_SB_CSP_IOCTL_UNLOAD_CODE _IO('H', 0x12) #define SNDRV_SB_CSP_IOCTL_UNLOAD_CODE _IO('H', 0x12)
/* start CSP */ /* start CSP */

View File

@ -599,4 +599,4 @@ module_exit(atmel_abdac_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Driver for Atmel Audio Bitstream DAC (ABDAC)"); MODULE_DESCRIPTION("Driver for Atmel Audio Bitstream DAC (ABDAC)");
MODULE_AUTHOR("Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com>"); MODULE_AUTHOR("Hans-Christian Egtvedt <egtvedt@samfundet.no>");

View File

@ -1199,4 +1199,4 @@ module_exit(atmel_ac97c_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Driver for Atmel AC97 controller"); MODULE_DESCRIPTION("Driver for Atmel AC97 controller");
MODULE_AUTHOR("Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com>"); MODULE_AUTHOR("Hans-Christian Egtvedt <egtvedt@samfundet.no>");

View File

@ -149,7 +149,7 @@ static int cs5535audio_build_dma_packets(struct cs5535audio *cs5535au,
&((struct cs5535audio_dma_desc *) dma->desc_buf.area)[i]; &((struct cs5535audio_dma_desc *) dma->desc_buf.area)[i];
desc->addr = cpu_to_le32(addr); desc->addr = cpu_to_le32(addr);
desc->size = cpu_to_le32(period_bytes); desc->size = cpu_to_le32(period_bytes);
desc->ctlreserved = cpu_to_le32(PRD_EOP); desc->ctlreserved = cpu_to_le16(PRD_EOP);
desc_addr += sizeof(struct cs5535audio_dma_desc); desc_addr += sizeof(struct cs5535audio_dma_desc);
addr += period_bytes; addr += period_bytes;
} }
@ -157,7 +157,7 @@ static int cs5535audio_build_dma_packets(struct cs5535audio *cs5535au,
lastdesc = &((struct cs5535audio_dma_desc *) dma->desc_buf.area)[periods]; lastdesc = &((struct cs5535audio_dma_desc *) dma->desc_buf.area)[periods];
lastdesc->addr = cpu_to_le32((u32) dma->desc_buf.addr); lastdesc->addr = cpu_to_le32((u32) dma->desc_buf.addr);
lastdesc->size = 0; lastdesc->size = 0;
lastdesc->ctlreserved = cpu_to_le32(PRD_JMP); lastdesc->ctlreserved = cpu_to_le16(PRD_JMP);
jmpprd_addr = cpu_to_le32(lastdesc->addr + jmpprd_addr = cpu_to_le32(lastdesc->addr +
(sizeof(struct cs5535audio_dma_desc)*periods)); (sizeof(struct cs5535audio_dma_desc)*periods));

View File

@ -294,7 +294,7 @@ static int hdmi_update_eld(struct hdmi_eld *e,
snd_printd(KERN_INFO "HDMI: out of range MNL %d\n", mnl); snd_printd(KERN_INFO "HDMI: out of range MNL %d\n", mnl);
goto out_fail; goto out_fail;
} else } else
strlcpy(e->monitor_name, buf + ELD_FIXED_BYTES, mnl); strlcpy(e->monitor_name, buf + ELD_FIXED_BYTES, mnl + 1);
for (i = 0; i < e->sad_count; i++) { for (i = 0; i < e->sad_count; i++) {
if (ELD_FIXED_BYTES + mnl + 3 * (i + 1) > size) { if (ELD_FIXED_BYTES + mnl + 3 * (i + 1) > size) {

View File

@ -2707,17 +2707,30 @@ typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol, static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol, struct snd_ctl_elem_value *ucontrol,
getput_call_t func) getput_call_t func, bool check_adc_switch)
{ {
struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); int i, err;
int err;
mutex_lock(&codec->control_mutex); mutex_lock(&codec->control_mutex);
kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx], if (check_adc_switch && spec->dual_adc_switch) {
for (i = 0; i < spec->num_adc_nids; i++) {
kcontrol->private_value =
HDA_COMPOSE_AMP_VAL(spec->adc_nids[i],
3, 0, HDA_INPUT); 3, 0, HDA_INPUT);
err = func(kcontrol, ucontrol); err = func(kcontrol, ucontrol);
if (err < 0)
goto error;
}
} else {
i = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
kcontrol->private_value =
HDA_COMPOSE_AMP_VAL(spec->adc_nids[i],
3, 0, HDA_INPUT);
err = func(kcontrol, ucontrol);
}
error:
mutex_unlock(&codec->control_mutex); mutex_unlock(&codec->control_mutex);
return err; return err;
} }
@ -2726,14 +2739,14 @@ static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
return alc_cap_getput_caller(kcontrol, ucontrol, return alc_cap_getput_caller(kcontrol, ucontrol,
snd_hda_mixer_amp_volume_get); snd_hda_mixer_amp_volume_get, false);
} }
static int alc_cap_vol_put(struct snd_kcontrol *kcontrol, static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
return alc_cap_getput_caller(kcontrol, ucontrol, return alc_cap_getput_caller(kcontrol, ucontrol,
snd_hda_mixer_amp_volume_put); snd_hda_mixer_amp_volume_put, true);
} }
/* capture mixer elements */ /* capture mixer elements */
@ -2743,14 +2756,14 @@ static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
return alc_cap_getput_caller(kcontrol, ucontrol, return alc_cap_getput_caller(kcontrol, ucontrol,
snd_hda_mixer_amp_switch_get); snd_hda_mixer_amp_switch_get, false);
} }
static int alc_cap_sw_put(struct snd_kcontrol *kcontrol, static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
return alc_cap_getput_caller(kcontrol, ucontrol, return alc_cap_getput_caller(kcontrol, ucontrol,
snd_hda_mixer_amp_switch_put); snd_hda_mixer_amp_switch_put, true);
} }
#define _DEFINE_CAPMIX(num) \ #define _DEFINE_CAPMIX(num) \

View File

@ -896,11 +896,11 @@ struct hdspm {
unsigned char max_channels_in; unsigned char max_channels_in;
unsigned char max_channels_out; unsigned char max_channels_out;
char *channel_map_in; signed char *channel_map_in;
char *channel_map_out; signed char *channel_map_out;
char *channel_map_in_ss, *channel_map_in_ds, *channel_map_in_qs; signed char *channel_map_in_ss, *channel_map_in_ds, *channel_map_in_qs;
char *channel_map_out_ss, *channel_map_out_ds, *channel_map_out_qs; signed char *channel_map_out_ss, *channel_map_out_ds, *channel_map_out_qs;
char **port_names_in; char **port_names_in;
char **port_names_out; char **port_names_out;

View File

@ -1124,6 +1124,6 @@ static void __exit at73c213_exit(void)
} }
module_exit(at73c213_exit); module_exit(at73c213_exit);
MODULE_AUTHOR("Hans-Christian Egtvedt <hcegtvedt@atmel.com>"); MODULE_AUTHOR("Hans-Christian Egtvedt <egtvedt@samfundet.no>");
MODULE_DESCRIPTION("Sound driver for AT73C213 with Atmel SSC"); MODULE_DESCRIPTION("Sound driver for AT73C213 with Atmel SSC");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");