When handling I/O request for ELEM_WRITE, 'snd_power_wait()' function is used before a call of 'snd_ctl_elem_write()' function. This is perhaps due to performing I/O operation to actual devices. The same thing is done by helper functions for native/compat ABI, and they can be unified.
This commit moves these duplicated codes into the callee function.
Signed-off-by: Takashi Sakamoto o-takashi@sakamocchi.jp --- sound/core/control.c | 31 +++++++++++++++---------------- sound/core/control_compat.c | 3 --- 2 files changed, 15 insertions(+), 19 deletions(-)
diff --git a/sound/core/control.c b/sound/core/control.c index 2b5921e9f111..8d158a49467d 100644 --- a/sound/core/control.c +++ b/sound/core/control.c @@ -954,27 +954,33 @@ static int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file, unsigned int index_offset; int result;
- kctl = snd_ctl_find_id(card, &control->id); - if (kctl == NULL) - return -ENOENT; + result = snd_power_wait(file->card, SNDRV_CTL_POWER_D0); + if (result < 0) + return result; + + down_write(&file->card->controls_rwsem); + kctl = snd_ctl_find_id(file->card, &control->id); + if (kctl == NULL) { + result = -ENOENT; + goto end; + }
index_offset = snd_ctl_get_ioff(kctl, &control->id); vd = &kctl->vd[index_offset]; if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_WRITE) || kctl->put == NULL || (file && vd->owner && vd->owner != file)) { - return -EPERM; + result = -EPERM; + goto end; }
snd_ctl_build_ioff(&control->id, kctl, index_offset); result = kctl->put(kctl, control); - if (result < 0) - return result; - if (result > 0) { struct snd_ctl_elem_id id = control->id; - snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &id); + snd_ctl_notify(file->card, SNDRV_CTL_EVENT_MASK_VALUE, &id); } - +end: + up_write(&file->card->controls_rwsem); return 0; }
@@ -989,14 +995,7 @@ static int snd_ctl_elem_write_user(struct snd_ctl_file *file, if (IS_ERR(control)) return PTR_ERR(control);
- card = file->card; - result = snd_power_wait(card, SNDRV_CTL_POWER_D0); - if (result < 0) - goto error; - - down_write(&card->controls_rwsem); result = snd_ctl_elem_write(card, file, control); - up_write(&card->controls_rwsem); if (result < 0) goto error;
diff --git a/sound/core/control_compat.c b/sound/core/control_compat.c index b887cda28d30..b3f0be74ba0f 100644 --- a/sound/core/control_compat.c +++ b/sound/core/control_compat.c @@ -713,9 +713,6 @@ static int ctl_elem_write_user(struct snd_ctl_file *file, if (err < 0) goto error;
- err = snd_power_wait(card, SNDRV_CTL_POWER_D0); - if (err < 0) - goto error; err = snd_ctl_elem_write(card, file, data); if (err < 0) goto error;