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.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
4adab848ae
commit
a2e527c5a3
@ -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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
{
|
{
|
||||||
|
|
||||||
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 &=
|
||||||
|
Loading…
Reference in New Issue
Block a user