ALSA: timer: Simplify timer hw resolution calls
authorTakashi Iwai <tiwai@suse.de>
Wed, 16 May 2018 21:45:33 +0000 (23:45 +0200)
committerTakashi Iwai <tiwai@suse.de>
Fri, 18 May 2018 06:49:12 +0000 (08:49 +0200)
There multiple open-codes to get the hardware timer resolution.
Make a local helper function snd_timer_hw_resolution() and call it
from all relevant places.

There is no functional change by this, just a preliminary work for the
following timer resolution hardening patch.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/timer.c

index 0ddcae4958381758ab6189ca6ad7a97375ddf184..22c72857f379974a3a28c1bc507e2f6a95e83a8c 100644 (file)
@@ -427,6 +427,14 @@ int snd_timer_close(struct snd_timer_instance *timeri)
 }
 EXPORT_SYMBOL(snd_timer_close);
 
+static unsigned long snd_timer_hw_resolution(struct snd_timer *timer)
+{
+       if (timer->hw.c_resolution)
+               return timer->hw.c_resolution(timer);
+       else
+               return timer->hw.resolution;
+}
+
 unsigned long snd_timer_resolution(struct snd_timer_instance *timeri)
 {
        struct snd_timer * timer;
@@ -434,11 +442,8 @@ unsigned long snd_timer_resolution(struct snd_timer_instance *timeri)
        if (timeri == NULL)
                return 0;
        timer = timeri->timer;
-       if (timer) {
-               if (timer->hw.c_resolution)
-                       return timer->hw.c_resolution(timer);
-               return timer->hw.resolution;
-       }
+       if (timer)
+               return snd_timer_hw_resolution(timer);
        return 0;
 }
 EXPORT_SYMBOL(snd_timer_resolution);
@@ -771,10 +776,7 @@ void snd_timer_interrupt(struct snd_timer * timer, unsigned long ticks_left)
        spin_lock_irqsave(&timer->lock, flags);
 
        /* remember the current resolution */
-       if (timer->hw.c_resolution)
-               resolution = timer->hw.c_resolution(timer);
-       else
-               resolution = timer->hw.resolution;
+       resolution = snd_timer_hw_resolution(timer);
 
        /* loop for all active instances
         * Here we cannot use list_for_each_entry because the active_list of a
@@ -1014,12 +1016,8 @@ void snd_timer_notify(struct snd_timer *timer, int event, struct timespec *tstam
        spin_lock_irqsave(&timer->lock, flags);
        if (event == SNDRV_TIMER_EVENT_MSTART ||
            event == SNDRV_TIMER_EVENT_MCONTINUE ||
-           event == SNDRV_TIMER_EVENT_MRESUME) {
-               if (timer->hw.c_resolution)
-                       resolution = timer->hw.c_resolution(timer);
-               else
-                       resolution = timer->hw.resolution;
-       }
+           event == SNDRV_TIMER_EVENT_MRESUME)
+               resolution = snd_timer_hw_resolution(timer);
        list_for_each_entry(ti, &timer->active_list_head, active_list) {
                if (ti->ccallback)
                        ti->ccallback(ti, event, tstamp, resolution);
@@ -1656,10 +1654,7 @@ static int snd_timer_user_gstatus(struct file *file,
        mutex_lock(&register_mutex);
        t = snd_timer_find(&tid);
        if (t != NULL) {
-               if (t->hw.c_resolution)
-                       gstatus.resolution = t->hw.c_resolution(t);
-               else
-                       gstatus.resolution = t->hw.resolution;
+               gstatus.resolution = snd_timer_hw_resolution(t);
                if (t->hw.precise_resolution) {
                        t->hw.precise_resolution(t, &gstatus.resolution_num,
                                                 &gstatus.resolution_den);