Commit a2e527c5 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hdspm: Replace tasklet with work

The tasklet is an old API that should be deprecated, usually can be
converted to another decent API.  In HDSP-MADI driver, a tasklet is
still used for offloading the MIDI I/O handling (optional via mixer
switch).  It can be achieved gracefully with a work queued, too.

This patch replaces the tasklet usage in HDSP-MADI driver with a
simple work.  The conversion is fairly straightforward.  The only
significant difference is that the work initialization is moved to the
right place in snd_hdspm_create() and cancel_work_sync() is always
called in snd_hdspm_free() to assure killing the pending works.

Link: https://lore.kernel.org/r/20200903104131.21097-8-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 4adab848
...@@ -997,7 +997,7 @@ struct hdspm { ...@@ -997,7 +997,7 @@ struct hdspm {
u32 settings_register; /* cached value for AIO / RayDat (sync reference, master/slave) */ u32 settings_register; /* cached value for AIO / RayDat (sync reference, master/slave) */
struct hdspm_midi midi[4]; struct hdspm_midi midi[4];
struct tasklet_struct midi_tasklet; struct work_struct midi_work;
size_t period_bytes; size_t period_bytes;
unsigned char ss_in_channels; unsigned char ss_in_channels;
...@@ -2169,9 +2169,9 @@ static int snd_hdspm_create_midi(struct snd_card *card, ...@@ -2169,9 +2169,9 @@ static int snd_hdspm_create_midi(struct snd_card *card,
} }
static void hdspm_midi_tasklet(struct tasklet_struct *t) static void hdspm_midi_work(struct work_struct *work)
{ {
struct hdspm *hdspm = from_tasklet(hdspm, t, midi_tasklet); struct hdspm *hdspm = container_of(work, struct hdspm, midi_work);
int i = 0; int i = 0;
while (i < hdspm->midiPorts) { while (i < hdspm->midiPorts) {
...@@ -5449,7 +5449,7 @@ static irqreturn_t snd_hdspm_interrupt(int irq, void *dev_id) ...@@ -5449,7 +5449,7 @@ static irqreturn_t snd_hdspm_interrupt(int irq, void *dev_id)
} }
if (schedule) if (schedule)
tasklet_hi_schedule(&hdspm->midi_tasklet); queue_work(system_highpri_wq, &hdspm->midi_work);
} }
return IRQ_HANDLED; return IRQ_HANDLED;
...@@ -6538,6 +6538,7 @@ static int snd_hdspm_create(struct snd_card *card, ...@@ -6538,6 +6538,7 @@ static int snd_hdspm_create(struct snd_card *card,
hdspm->card = card; hdspm->card = card;
spin_lock_init(&hdspm->lock); spin_lock_init(&hdspm->lock);
INIT_WORK(&hdspm->midi_work, hdspm_midi_work);
pci_read_config_word(hdspm->pci, pci_read_config_word(hdspm->pci,
PCI_CLASS_REVISION, &hdspm->firmware_rev); PCI_CLASS_REVISION, &hdspm->firmware_rev);
...@@ -6836,9 +6837,6 @@ static int snd_hdspm_create(struct snd_card *card, ...@@ -6836,9 +6837,6 @@ static int snd_hdspm_create(struct snd_card *card,
} }
tasklet_setup(&hdspm->midi_tasklet, hdspm_midi_tasklet);
if (hdspm->io_type != MADIface) { if (hdspm->io_type != MADIface) {
hdspm->serial = (hdspm_read(hdspm, hdspm->serial = (hdspm_read(hdspm,
HDSPM_midiStatusIn0)>>8) & 0xFFFFFF; HDSPM_midiStatusIn0)>>8) & 0xFFFFFF;
...@@ -6873,6 +6871,7 @@ static int snd_hdspm_free(struct hdspm * hdspm) ...@@ -6873,6 +6871,7 @@ static int snd_hdspm_free(struct hdspm * hdspm)
{ {
if (hdspm->port) { if (hdspm->port) {
cancel_work_sync(&hdspm->midi_work);
/* stop th audio, and cancel all interrupts */ /* stop th audio, and cancel all interrupts */
hdspm->control_register &= hdspm->control_register &=
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment