Merge branch 'for-linus' into for-next

This commit is contained in:
Takashi Iwai 2016-02-09 23:08:48 +01:00
commit 9b88daa513
12 changed files with 52 additions and 47 deletions

View File

@ -422,7 +422,7 @@ static void snd_timer_notify1(struct snd_timer_instance *ti, int event)
spin_lock_irqsave(&timer->lock, flags); spin_lock_irqsave(&timer->lock, flags);
list_for_each_entry(ts, &ti->slave_active_head, active_list) list_for_each_entry(ts, &ti->slave_active_head, active_list)
if (ts->ccallback) if (ts->ccallback)
ts->ccallback(ti, event + 100, &tstamp, resolution); ts->ccallback(ts, event + 100, &tstamp, resolution);
spin_unlock_irqrestore(&timer->lock, flags); spin_unlock_irqrestore(&timer->lock, flags);
} }
@ -518,9 +518,13 @@ static int _snd_timer_stop(struct snd_timer_instance *timeri, int event)
spin_unlock_irqrestore(&slave_active_lock, flags); spin_unlock_irqrestore(&slave_active_lock, flags);
return -EBUSY; return -EBUSY;
} }
if (timeri->timer)
spin_lock(&timeri->timer->lock);
timeri->flags &= ~SNDRV_TIMER_IFLG_RUNNING; timeri->flags &= ~SNDRV_TIMER_IFLG_RUNNING;
list_del_init(&timeri->ack_list); list_del_init(&timeri->ack_list);
list_del_init(&timeri->active_list); list_del_init(&timeri->active_list);
if (timeri->timer)
spin_unlock(&timeri->timer->lock);
spin_unlock_irqrestore(&slave_active_lock, flags); spin_unlock_irqrestore(&slave_active_lock, flags);
goto __end; goto __end;
} }
@ -1929,6 +1933,7 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer,
{ {
struct snd_timer_user *tu; struct snd_timer_user *tu;
long result = 0, unit; long result = 0, unit;
int qhead;
int err = 0; int err = 0;
tu = file->private_data; tu = file->private_data;
@ -1940,7 +1945,7 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer,
if ((file->f_flags & O_NONBLOCK) != 0 || result > 0) { if ((file->f_flags & O_NONBLOCK) != 0 || result > 0) {
err = -EAGAIN; err = -EAGAIN;
break; goto _error;
} }
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
@ -1955,42 +1960,37 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer,
if (tu->disconnected) { if (tu->disconnected) {
err = -ENODEV; err = -ENODEV;
break; goto _error;
} }
if (signal_pending(current)) { if (signal_pending(current)) {
err = -ERESTARTSYS; err = -ERESTARTSYS;
break; goto _error;
} }
} }
qhead = tu->qhead++;
tu->qhead %= tu->queue_size;
spin_unlock_irq(&tu->qlock); spin_unlock_irq(&tu->qlock);
if (err < 0)
goto _error;
if (tu->tread) { if (tu->tread) {
if (copy_to_user(buffer, &tu->tqueue[tu->qhead++], if (copy_to_user(buffer, &tu->tqueue[qhead],
sizeof(struct snd_timer_tread))) { sizeof(struct snd_timer_tread)))
err = -EFAULT; err = -EFAULT;
goto _error;
}
} else { } else {
if (copy_to_user(buffer, &tu->queue[tu->qhead++], if (copy_to_user(buffer, &tu->queue[qhead],
sizeof(struct snd_timer_read))) { sizeof(struct snd_timer_read)))
err = -EFAULT; err = -EFAULT;
goto _error;
} }
}
tu->qhead %= tu->queue_size;
result += unit;
buffer += unit;
spin_lock_irq(&tu->qlock); spin_lock_irq(&tu->qlock);
tu->qused--; tu->qused--;
if (err < 0)
goto _error;
result += unit;
buffer += unit;
} }
spin_unlock_irq(&tu->qlock);
_error: _error:
spin_unlock_irq(&tu->qlock);
return result > 0 ? result : err; return result > 0 ? result : err;
} }

View File

@ -63,7 +63,7 @@ struct amdtp_dot {
#define BYTE_PER_SAMPLE (4) #define BYTE_PER_SAMPLE (4)
#define MAGIC_DOT_BYTE (2) #define MAGIC_DOT_BYTE (2)
#define MAGIC_BYTE_OFF(x) (((x) * BYTE_PER_SAMPLE) + MAGIC_DOT_BYTE) #define MAGIC_BYTE_OFF(x) (((x) * BYTE_PER_SAMPLE) + MAGIC_DOT_BYTE)
static const u8 dot_scrt(const u8 idx, const unsigned int off) static u8 dot_scrt(const u8 idx, const unsigned int off)
{ {
/* /*
* the length of the added pattern only depends on the lower nibble * the length of the added pattern only depends on the lower nibble

View File

@ -230,6 +230,7 @@ int snd_tscm_transaction_register(struct snd_tscm *tscm)
return err; return err;
error: error:
fw_core_remove_address_handler(&tscm->async_handler); fw_core_remove_address_handler(&tscm->async_handler);
tscm->async_handler.callback_data = NULL;
return err; return err;
} }
@ -276,6 +277,9 @@ void snd_tscm_transaction_unregister(struct snd_tscm *tscm)
__be32 reg; __be32 reg;
unsigned int i; unsigned int i;
if (tscm->async_handler.callback_data == NULL)
return;
/* Turn off FireWire LED. */ /* Turn off FireWire LED. */
reg = cpu_to_be32(0x0000008e); reg = cpu_to_be32(0x0000008e);
snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
@ -297,6 +301,8 @@ void snd_tscm_transaction_unregister(struct snd_tscm *tscm)
&reg, sizeof(reg), 0); &reg, sizeof(reg), 0);
fw_core_remove_address_handler(&tscm->async_handler); fw_core_remove_address_handler(&tscm->async_handler);
tscm->async_handler.callback_data = NULL;
for (i = 0; i < TSCM_MIDI_OUT_PORT_MAX; i++) for (i = 0; i < TSCM_MIDI_OUT_PORT_MAX; i++)
snd_fw_async_midi_port_destroy(&tscm->out_ports[i]); snd_fw_async_midi_port_destroy(&tscm->out_ports[i]);
} }

View File

@ -21,7 +21,6 @@ static struct snd_tscm_spec model_specs[] = {
.pcm_playback_analog_channels = 8, .pcm_playback_analog_channels = 8,
.midi_capture_ports = 4, .midi_capture_ports = 4,
.midi_playback_ports = 4, .midi_playback_ports = 4,
.is_controller = true,
}, },
{ {
.name = "FW-1082", .name = "FW-1082",
@ -31,9 +30,16 @@ static struct snd_tscm_spec model_specs[] = {
.pcm_playback_analog_channels = 2, .pcm_playback_analog_channels = 2,
.midi_capture_ports = 2, .midi_capture_ports = 2,
.midi_playback_ports = 2, .midi_playback_ports = 2,
.is_controller = true,
}, },
/* FW-1804 may be supported. */ {
.name = "FW-1804",
.has_adat = true,
.has_spdif = true,
.pcm_capture_analog_channels = 8,
.pcm_playback_analog_channels = 2,
.midi_capture_ports = 2,
.midi_playback_ports = 4,
},
}; };
static int identify_model(struct snd_tscm *tscm) static int identify_model(struct snd_tscm *tscm)

View File

@ -39,7 +39,6 @@ struct snd_tscm_spec {
unsigned int pcm_playback_analog_channels; unsigned int pcm_playback_analog_channels;
unsigned int midi_capture_ports; unsigned int midi_capture_ports;
unsigned int midi_playback_ports; unsigned int midi_playback_ports;
bool is_controller;
}; };
#define TSCM_MIDI_IN_PORT_MAX 4 #define TSCM_MIDI_IN_PORT_MAX 4
@ -72,9 +71,6 @@ struct snd_tscm {
struct snd_fw_async_midi_port out_ports[TSCM_MIDI_OUT_PORT_MAX]; struct snd_fw_async_midi_port out_ports[TSCM_MIDI_OUT_PORT_MAX];
u8 running_status[TSCM_MIDI_OUT_PORT_MAX]; u8 running_status[TSCM_MIDI_OUT_PORT_MAX];
bool on_sysex[TSCM_MIDI_OUT_PORT_MAX]; bool on_sysex[TSCM_MIDI_OUT_PORT_MAX];
/* For control messages. */
struct snd_firewire_tascam_status *status;
}; };
#define TSCM_ADDR_BASE 0xffff00000000ull #define TSCM_ADDR_BASE 0xffff00000000ull

View File

@ -4028,9 +4028,9 @@ static void pin_power_callback(struct hda_codec *codec,
struct hda_jack_callback *jack, struct hda_jack_callback *jack,
bool on) bool on)
{ {
if (jack && jack->tbl->nid) if (jack && jack->nid)
sync_power_state_change(codec, sync_power_state_change(codec,
set_pin_power_jack(codec, jack->tbl->nid, on)); set_pin_power_jack(codec, jack->nid, on));
} }
/* callback only doing power up -- called at first */ /* callback only doing power up -- called at first */

View File

@ -259,7 +259,7 @@ snd_hda_jack_detect_enable_callback(struct hda_codec *codec, hda_nid_t nid,
if (!callback) if (!callback)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
callback->func = func; callback->func = func;
callback->tbl = jack; callback->nid = jack->nid;
callback->next = jack->callback; callback->next = jack->callback;
jack->callback = callback; jack->callback = callback;
} }

View File

@ -21,7 +21,7 @@ struct hda_jack_callback;
typedef void (*hda_jack_callback_fn) (struct hda_codec *, struct hda_jack_callback *); typedef void (*hda_jack_callback_fn) (struct hda_codec *, struct hda_jack_callback *);
struct hda_jack_callback { struct hda_jack_callback {
struct hda_jack_tbl *tbl; hda_nid_t nid;
hda_jack_callback_fn func; hda_jack_callback_fn func;
unsigned int private_data; /* arbitrary data */ unsigned int private_data; /* arbitrary data */
struct hda_jack_callback *next; struct hda_jack_callback *next;

View File

@ -4427,13 +4427,16 @@ static void ca0132_process_dsp_response(struct hda_codec *codec,
static void hp_callback(struct hda_codec *codec, struct hda_jack_callback *cb) static void hp_callback(struct hda_codec *codec, struct hda_jack_callback *cb)
{ {
struct ca0132_spec *spec = codec->spec; struct ca0132_spec *spec = codec->spec;
struct hda_jack_tbl *tbl;
/* Delay enabling the HP amp, to let the mic-detection /* Delay enabling the HP amp, to let the mic-detection
* state machine run. * state machine run.
*/ */
cancel_delayed_work_sync(&spec->unsol_hp_work); cancel_delayed_work_sync(&spec->unsol_hp_work);
schedule_delayed_work(&spec->unsol_hp_work, msecs_to_jiffies(500)); schedule_delayed_work(&spec->unsol_hp_work, msecs_to_jiffies(500));
cb->tbl->block_report = 1; tbl = snd_hda_jack_tbl_get(codec, cb->nid);
if (tbl)
tbl->block_report = 1;
} }
static void amic_callback(struct hda_codec *codec, struct hda_jack_callback *cb) static void amic_callback(struct hda_codec *codec, struct hda_jack_callback *cb)

View File

@ -448,7 +448,8 @@ static int hdmi_eld_ctl_get(struct snd_kcontrol *kcontrol,
eld = &per_pin->sink_eld; eld = &per_pin->sink_eld;
mutex_lock(&per_pin->lock); mutex_lock(&per_pin->lock);
if (eld->eld_size > ARRAY_SIZE(ucontrol->value.bytes.data)) { if (eld->eld_size > ARRAY_SIZE(ucontrol->value.bytes.data) ||
eld->eld_size > ELD_MAX_SIZE) {
mutex_unlock(&per_pin->lock); mutex_unlock(&per_pin->lock);
snd_BUG(); snd_BUG();
return -EINVAL; return -EINVAL;
@ -1193,7 +1194,7 @@ static void check_presence_and_report(struct hda_codec *codec, hda_nid_t nid)
static void jack_callback(struct hda_codec *codec, static void jack_callback(struct hda_codec *codec,
struct hda_jack_callback *jack) struct hda_jack_callback *jack)
{ {
check_presence_and_report(codec, jack->tbl->nid); check_presence_and_report(codec, jack->nid);
} }
static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res) static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res)

View File

@ -282,7 +282,7 @@ static void alc_update_knob_master(struct hda_codec *codec,
uctl = kzalloc(sizeof(*uctl), GFP_KERNEL); uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
if (!uctl) if (!uctl)
return; return;
val = snd_hda_codec_read(codec, jack->tbl->nid, 0, val = snd_hda_codec_read(codec, jack->nid, 0,
AC_VERB_GET_VOLUME_KNOB_CONTROL, 0); AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
val &= HDA_AMP_VOLMASK; val &= HDA_AMP_VOLMASK;
uctl->value.integer.value[0] = val; uctl->value.integer.value[0] = val;
@ -1787,7 +1787,6 @@ enum {
ALC882_FIXUP_NO_PRIMARY_HP, ALC882_FIXUP_NO_PRIMARY_HP,
ALC887_FIXUP_ASUS_BASS, ALC887_FIXUP_ASUS_BASS,
ALC887_FIXUP_BASS_CHMAP, ALC887_FIXUP_BASS_CHMAP,
ALC882_FIXUP_DISABLE_AAMIX,
}; };
static void alc889_fixup_coef(struct hda_codec *codec, static void alc889_fixup_coef(struct hda_codec *codec,
@ -1949,8 +1948,6 @@ static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
static void alc_fixup_bass_chmap(struct hda_codec *codec, static void alc_fixup_bass_chmap(struct hda_codec *codec,
const struct hda_fixup *fix, int action); const struct hda_fixup *fix, int action);
static void alc_fixup_disable_aamix(struct hda_codec *codec,
const struct hda_fixup *fix, int action);
static const struct hda_fixup alc882_fixups[] = { static const struct hda_fixup alc882_fixups[] = {
[ALC882_FIXUP_ABIT_AW9D_MAX] = { [ALC882_FIXUP_ABIT_AW9D_MAX] = {
@ -2188,10 +2185,6 @@ static const struct hda_fixup alc882_fixups[] = {
.type = HDA_FIXUP_FUNC, .type = HDA_FIXUP_FUNC,
.v.func = alc_fixup_bass_chmap, .v.func = alc_fixup_bass_chmap,
}, },
[ALC882_FIXUP_DISABLE_AAMIX] = {
.type = HDA_FIXUP_FUNC,
.v.func = alc_fixup_disable_aamix,
},
}; };
static const struct snd_pci_quirk alc882_fixup_tbl[] = { static const struct snd_pci_quirk alc882_fixup_tbl[] = {
@ -2230,6 +2223,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT), SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP), SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP), SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
/* All Apple entries are in codec SSIDs */ /* All Apple entries are in codec SSIDs */
SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF), SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
@ -2259,7 +2253,6 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD), SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3), SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE), SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
SND_PCI_QUIRK(0x1458, 0xa182, "Gigabyte Z170X-UD3", ALC882_FIXUP_DISABLE_AAMIX),
SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX), SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD), SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD), SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),

View File

@ -493,9 +493,9 @@ static void jack_update_power(struct hda_codec *codec,
if (!spec->num_pwrs) if (!spec->num_pwrs)
return; return;
if (jack && jack->tbl->nid) { if (jack && jack->nid) {
stac_toggle_power_map(codec, jack->tbl->nid, stac_toggle_power_map(codec, jack->nid,
snd_hda_jack_detect(codec, jack->tbl->nid), snd_hda_jack_detect(codec, jack->nid),
true); true);
return; return;
} }