ALSA: Replace timespec with timespec64
authorBaolin Wang <baolin.wang@linaro.org>
Tue, 24 Apr 2018 12:06:08 +0000 (20:06 +0800)
committerArnd Bergmann <arnd@arndb.de>
Wed, 11 Dec 2019 21:06:14 +0000 (22:06 +0100)
Since timespec is not year 2038 safe on 32bit system, and we need to
convert all timespec variables to timespec64 type for sound subsystem.

This patch is used to do preparation for following patches, that will
convert all structures defined in uapi/sound/asound.h to use 64-bit
time_t.

Signed-off-by: Baolin Wang <baolin.wang@linaro.org>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
include/sound/pcm.h
include/sound/soc-component.h
include/sound/timer.h
sound/core/pcm_lib.c
sound/core/pcm_native.c
sound/core/timer.c
sound/drivers/aloop.c
sound/pci/hda/hda_controller.c
sound/soc/intel/skylake/skl-pcm.c

index 8a89fa6fdd5e5e85b2075873fba0bf476d3ecd75..cb407fade933e65cd7d8be8e11dd86f671061496 100644 (file)
@@ -62,7 +62,7 @@ struct snd_pcm_ops {
        int (*sync_stop)(struct snd_pcm_substream *substream);
        snd_pcm_uframes_t (*pointer)(struct snd_pcm_substream *substream);
        int (*get_time_info)(struct snd_pcm_substream *substream,
-                       struct timespec *system_ts, struct timespec *audio_ts,
+                       struct timespec64 *system_ts, struct timespec64 *audio_ts,
                        struct snd_pcm_audio_tstamp_config *audio_tstamp_config,
                        struct snd_pcm_audio_tstamp_report *audio_tstamp_report);
        int (*fill_silence)(struct snd_pcm_substream *substream, int channel,
@@ -343,7 +343,7 @@ static inline void snd_pcm_pack_audio_tstamp_report(__u32 *data, __u32 *accuracy
 struct snd_pcm_runtime {
        /* -- Status -- */
        struct snd_pcm_substream *trigger_master;
-       struct timespec trigger_tstamp; /* trigger timestamp */
+       struct timespec64 trigger_tstamp;       /* trigger timestamp */
        bool trigger_tstamp_latched;     /* trigger timestamp latched in low-level driver/hardware */
        int overrange;
        snd_pcm_uframes_t avail_max;
@@ -421,7 +421,7 @@ struct snd_pcm_runtime {
        /* -- audio timestamp config -- */
        struct snd_pcm_audio_tstamp_config audio_tstamp_config;
        struct snd_pcm_audio_tstamp_report audio_tstamp_report;
-       struct timespec driver_tstamp;
+       struct timespec64 driver_tstamp;
 
 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
        /* -- OSS things -- */
@@ -1155,22 +1155,22 @@ static inline void snd_pcm_set_runtime_buffer(struct snd_pcm_substream *substrea
 }
 
 /**
- * snd_pcm_gettime - Fill the timespec depending on the timestamp mode
+ * snd_pcm_gettime - Fill the timespec64 depending on the timestamp mode
  * @runtime: PCM runtime instance
- * @tv: timespec to fill
+ * @tv: timespec64 to fill
  */
 static inline void snd_pcm_gettime(struct snd_pcm_runtime *runtime,
-                                  struct timespec *tv)
+                                  struct timespec64 *tv)
 {
        switch (runtime->tstamp_type) {
        case SNDRV_PCM_TSTAMP_TYPE_MONOTONIC:
-               ktime_get_ts(tv);
+               ktime_get_ts64(tv);
                break;
        case SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW:
-               getrawmonotonic(tv);
+               ktime_get_raw_ts64(tv);
                break;
        default:
-               getnstimeofday(tv);
+               ktime_get_real_ts64(tv);
                break;
        }
 }
index 506f72a6b2c242e66caf1e00dbc6191927a8defe..154d02fbbfed69085e7d36c68856951f525f4c1f 100644 (file)
@@ -93,8 +93,8 @@ struct snd_soc_component_driver {
        snd_pcm_uframes_t (*pointer)(struct snd_soc_component *component,
                                     struct snd_pcm_substream *substream);
        int (*get_time_info)(struct snd_soc_component *component,
-               struct snd_pcm_substream *substream, struct timespec *system_ts,
-               struct timespec *audio_ts,
+               struct snd_pcm_substream *substream, struct timespec64 *system_ts,
+               struct timespec64 *audio_ts,
                struct snd_pcm_audio_tstamp_config *audio_tstamp_config,
                struct snd_pcm_audio_tstamp_report *audio_tstamp_report);
        int (*copy_user)(struct snd_soc_component *component,
index a53e37bcd746f24fe3354d445eda91e2efb934ba..23e885d31525a2e1bfa76da4a166438d1afaaca0 100644 (file)
@@ -89,7 +89,7 @@ struct snd_timer_instance {
                          unsigned long ticks, unsigned long resolution);
        void (*ccallback) (struct snd_timer_instance * timeri,
                           int event,
-                          struct timespec * tstamp,
+                          struct timespec64 * tstamp,
                           unsigned long resolution);
        void (*disconnect)(struct snd_timer_instance *timeri);
        void *callback_data;
@@ -113,7 +113,7 @@ struct snd_timer_instance {
  */
 
 int snd_timer_new(struct snd_card *card, char *id, struct snd_timer_id *tid, struct snd_timer **rtimer);
-void snd_timer_notify(struct snd_timer *timer, int event, struct timespec *tstamp);
+void snd_timer_notify(struct snd_timer *timer, int event, struct timespec64 *tstamp);
 int snd_timer_global_new(char *id, int device, struct snd_timer **rtimer);
 int snd_timer_global_free(struct snd_timer *timer);
 int snd_timer_global_register(struct snd_timer *timer);
index 2236b5e0c1f25d04e2ca2f2fa91114e118a4c47d..ea5518d44e66958aed51d4860b8dde019702c75d 100644 (file)
@@ -144,8 +144,12 @@ void __snd_pcm_xrun(struct snd_pcm_substream *substream)
        struct snd_pcm_runtime *runtime = substream->runtime;
 
        trace_xrun(substream);
-       if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE)
-               snd_pcm_gettime(runtime, (struct timespec *)&runtime->status->tstamp);
+       if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) {
+               struct timespec64 tstamp;
+
+               snd_pcm_gettime(runtime, &tstamp);
+               runtime->status->tstamp = timespec64_to_timespec(tstamp);
+       }
        snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
        if (xrun_debug(substream, XRUN_DEBUG_BASIC)) {
                char name[16];
@@ -200,12 +204,12 @@ int snd_pcm_update_state(struct snd_pcm_substream *substream,
 }
 
 static void update_audio_tstamp(struct snd_pcm_substream *substream,
-                               struct timespec *curr_tstamp,
-                               struct timespec *audio_tstamp)
+                               struct timespec64 *curr_tstamp,
+                               struct timespec64 *audio_tstamp)
 {
        struct snd_pcm_runtime *runtime = substream->runtime;
        u64 audio_frames, audio_nsecs;
-       struct timespec driver_tstamp;
+       struct timespec64 driver_tstamp;
 
        if (runtime->tstamp_mode != SNDRV_PCM_TSTAMP_ENABLE)
                return;
@@ -229,18 +233,22 @@ static void update_audio_tstamp(struct snd_pcm_substream *substream,
                }
                audio_nsecs = div_u64(audio_frames * 1000000000LL,
                                runtime->rate);
-               *audio_tstamp = ns_to_timespec(audio_nsecs);
+               *audio_tstamp = ns_to_timespec64(audio_nsecs);
        }
-       if (!timespec_equal(&runtime->status->audio_tstamp, audio_tstamp)) {
-               runtime->status->audio_tstamp = *audio_tstamp;
-               runtime->status->tstamp = *curr_tstamp;
+
+       if (runtime->status->audio_tstamp.tv_sec != audio_tstamp->tv_sec ||
+           runtime->status->audio_tstamp.tv_nsec != audio_tstamp->tv_nsec) {
+               runtime->status->audio_tstamp =
+                       timespec64_to_timespec(*audio_tstamp);
+               runtime->status->tstamp = timespec64_to_timespec(*curr_tstamp);
        }
 
+
        /*
         * re-take a driver timestamp to let apps detect if the reference tstamp
         * read by low-level hardware was provided with a delay
         */
-       snd_pcm_gettime(substream->runtime, (struct timespec *)&driver_tstamp);
+       snd_pcm_gettime(substream->runtime, &driver_tstamp);
        runtime->driver_tstamp = driver_tstamp;
 }
 
@@ -253,8 +261,8 @@ static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream,
        snd_pcm_sframes_t hdelta, delta;
        unsigned long jdelta;
        unsigned long curr_jiffies;
-       struct timespec curr_tstamp;
-       struct timespec audio_tstamp;
+       struct timespec64 curr_tstamp;
+       struct timespec64 audio_tstamp;
        int crossed_boundary = 0;
 
        old_hw_ptr = runtime->status->hw_ptr;
@@ -277,9 +285,9 @@ static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream,
 
                        /* re-test in case tstamp type is not supported in hardware and was demoted to DEFAULT */
                        if (runtime->audio_tstamp_report.actual_type == SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT)
-                               snd_pcm_gettime(runtime, (struct timespec *)&curr_tstamp);
+                               snd_pcm_gettime(runtime, &curr_tstamp);
                } else
-                       snd_pcm_gettime(runtime, (struct timespec *)&curr_tstamp);
+                       snd_pcm_gettime(runtime, &curr_tstamp);
        }
 
        if (pos == SNDRV_PCM_POS_XRUN) {
index 1fe581167b7b9aad19be6a06c3c5d98d3183cf45..67fe14bad7cb471ed8368b9b215a74fcfdf37e1d 100644 (file)
@@ -918,12 +918,12 @@ int snd_pcm_status(struct snd_pcm_substream *substream,
        status->suspended_state = runtime->status->suspended_state;
        if (status->state == SNDRV_PCM_STATE_OPEN)
                goto _end;
-       status->trigger_tstamp = runtime->trigger_tstamp;
+       status->trigger_tstamp = timespec64_to_timespec(runtime->trigger_tstamp);
        if (snd_pcm_running(substream)) {
                snd_pcm_update_hw_ptr(substream);
                if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) {
                        status->tstamp = runtime->status->tstamp;
-                       status->driver_tstamp = runtime->driver_tstamp;
+                       status->driver_tstamp = timespec64_to_timespec(runtime->driver_tstamp);
                        status->audio_tstamp =
                                runtime->status->audio_tstamp;
                        if (runtime->audio_tstamp_report.valid == 1)
@@ -936,8 +936,12 @@ int snd_pcm_status(struct snd_pcm_substream *substream,
                }
        } else {
                /* get tstamp only in fallback mode and only if enabled */
-               if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE)
-                       snd_pcm_gettime(runtime, &status->tstamp);
+               if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) {
+                       struct timespec64 tstamp;
+
+                       snd_pcm_gettime(runtime, &tstamp);
+                       status->tstamp = timespec64_to_timespec(tstamp);
+               }
        }
  _tstamp_end:
        status->appl_ptr = runtime->control->appl_ptr;
index 24fed5c78273934028e392a24d34ef611da43139..d808d5554c7a3d42811271f3ee32a94350a5e467 100644 (file)
@@ -59,7 +59,7 @@ struct snd_timer_user {
        spinlock_t qlock;
        unsigned long last_resolution;
        unsigned int filter;
-       struct timespec tstamp;         /* trigger tstamp */
+       struct timespec64 tstamp;               /* trigger tstamp */
        wait_queue_head_t qchange_sleep;
        struct fasync_struct *fasync;
        struct mutex ioctl_lock;
@@ -453,12 +453,12 @@ static void snd_timer_notify1(struct snd_timer_instance *ti, int event)
        struct snd_timer *timer = ti->timer;
        unsigned long resolution = 0;
        struct snd_timer_instance *ts;
-       struct timespec tstamp;
+       struct timespec64 tstamp;
 
        if (timer_tstamp_monotonic)
-               ktime_get_ts(&tstamp);
+               ktime_get_ts64(&tstamp);
        else
-               getnstimeofday(&tstamp);
+               ktime_get_real_ts64(&tstamp);
        if (snd_BUG_ON(event < SNDRV_TIMER_EVENT_START ||
                       event > SNDRV_TIMER_EVENT_PAUSE))
                return;
@@ -1025,7 +1025,7 @@ static int snd_timer_dev_disconnect(struct snd_device *device)
        return 0;
 }
 
-void snd_timer_notify(struct snd_timer *timer, int event, struct timespec *tstamp)
+void snd_timer_notify(struct snd_timer *timer, int event, struct timespec64 *tstamp)
 {
        unsigned long flags;
        unsigned long resolution = 0;
@@ -1318,7 +1318,7 @@ static void snd_timer_user_append_to_tqueue(struct snd_timer_user *tu,
 
 static void snd_timer_user_ccallback(struct snd_timer_instance *timeri,
                                     int event,
-                                    struct timespec *tstamp,
+                                    struct timespec64 *tstamp,
                                     unsigned long resolution)
 {
        struct snd_timer_user *tu = timeri->callback_data;
@@ -1332,7 +1332,7 @@ static void snd_timer_user_ccallback(struct snd_timer_instance *timeri,
                return;
        memset(&r1, 0, sizeof(r1));
        r1.event = event;
-       r1.tstamp = *tstamp;
+       r1.tstamp = timespec64_to_timespec(*tstamp);
        r1.val = resolution;
        spin_lock_irqsave(&tu->qlock, flags);
        snd_timer_user_append_to_tqueue(tu, &r1);
@@ -1355,7 +1355,7 @@ static void snd_timer_user_tinterrupt(struct snd_timer_instance *timeri,
 {
        struct snd_timer_user *tu = timeri->callback_data;
        struct snd_timer_tread *r, r1;
-       struct timespec tstamp;
+       struct timespec64 tstamp;
        int prev, append = 0;
 
        memset(&r1, 0, sizeof(r1));
@@ -1368,14 +1368,14 @@ static void snd_timer_user_tinterrupt(struct snd_timer_instance *timeri,
        }
        if (tu->last_resolution != resolution || ticks > 0) {
                if (timer_tstamp_monotonic)
-                       ktime_get_ts(&tstamp);
+                       ktime_get_ts64(&tstamp);
                else
-                       getnstimeofday(&tstamp);
+                       ktime_get_real_ts64(&tstamp);
        }
        if ((tu->filter & (1 << SNDRV_TIMER_EVENT_RESOLUTION)) &&
            tu->last_resolution != resolution) {
                r1.event = SNDRV_TIMER_EVENT_RESOLUTION;
-               r1.tstamp = tstamp;
+               r1.tstamp = timespec64_to_timespec(tstamp);
                r1.val = resolution;
                snd_timer_user_append_to_tqueue(tu, &r1);
                tu->last_resolution = resolution;
@@ -1389,14 +1389,14 @@ static void snd_timer_user_tinterrupt(struct snd_timer_instance *timeri,
                prev = tu->qtail == 0 ? tu->queue_size - 1 : tu->qtail - 1;
                r = &tu->tqueue[prev];
                if (r->event == SNDRV_TIMER_EVENT_TICK) {
-                       r->tstamp = tstamp;
+                       r->tstamp = timespec64_to_timespec(tstamp);
                        r->val += ticks;
                        append++;
                        goto __wake;
                }
        }
        r1.event = SNDRV_TIMER_EVENT_TICK;
-       r1.tstamp = tstamp;
+       r1.tstamp = timespec64_to_timespec(tstamp);
        r1.val = ticks;
        snd_timer_user_append_to_tqueue(tu, &r1);
        append++;
@@ -1885,7 +1885,7 @@ static int snd_timer_user_status(struct file *file,
        if (!tu->timeri)
                return -EBADFD;
        memset(&status, 0, sizeof(status));
-       status.tstamp = tu->tstamp;
+       status.tstamp = timespec64_to_timespec(tu->tstamp);
        status.resolution = snd_timer_resolution(tu->timeri);
        status.lost = tu->timeri->lost;
        status.overrun = tu->overrun;
index 6bb46423f5ae1a99b6fde6d188f9cdbdfb9aaf5c..bc83b17315416c52b351bb2fb3426573399dc092 100644 (file)
@@ -804,7 +804,7 @@ static void loopback_snd_timer_tasklet(unsigned long arg)
 
 static void loopback_snd_timer_event(struct snd_timer_instance *timeri,
                                     int event,
-                                    struct timespec *tstamp,
+                                    struct timespec64 *tstamp,
                                     unsigned long resolution)
 {
        /* Do not lock cable->lock here because timer->lock is already hold.
index 2f3b7a35f2d9cdb3b9262d220c962336f6653205..e95c3ae7aa93a8cf864fba5014f103c65630061b 100644 (file)
@@ -491,7 +491,7 @@ static inline bool is_link_time_supported(struct snd_pcm_runtime *runtime,
 }
 
 static int azx_get_time_info(struct snd_pcm_substream *substream,
-                       struct timespec *system_ts, struct timespec *audio_ts,
+                       struct timespec64 *system_ts, struct timespec64 *audio_ts,
                        struct snd_pcm_audio_tstamp_config *audio_tstamp_config,
                        struct snd_pcm_audio_tstamp_report *audio_tstamp_report)
 {
@@ -511,7 +511,7 @@ static int azx_get_time_info(struct snd_pcm_substream *substream,
                if (audio_tstamp_config->report_delay)
                        nsec = azx_adjust_codec_delay(substream, nsec);
 
-               *audio_ts = ns_to_timespec(nsec);
+               *audio_ts = ns_to_timespec64(nsec);
 
                audio_tstamp_report->actual_type = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK;
                audio_tstamp_report->accuracy_report = 1; /* rest of structure is valid */
@@ -528,16 +528,16 @@ static int azx_get_time_info(struct snd_pcm_substream *substream,
                        return -EINVAL;
 
                case SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW:
-                       *system_ts = ktime_to_timespec(xtstamp.sys_monoraw);
+                       *system_ts = ktime_to_timespec64(xtstamp.sys_monoraw);
                        break;
 
                default:
-                       *system_ts = ktime_to_timespec(xtstamp.sys_realtime);
+                       *system_ts = ktime_to_timespec64(xtstamp.sys_realtime);
                        break;
 
                }
 
-               *audio_ts = ktime_to_timespec(xtstamp.device);
+               *audio_ts = ktime_to_timespec64(xtstamp.device);
 
                audio_tstamp_report->actual_type =
                        SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED;
index 8b9abb79a69e612f1db57acba168c4d9b0675254..900746c30bffe1610db18492d68beb53b4833480 100644 (file)
@@ -1258,7 +1258,7 @@ static u64 skl_adjust_codec_delay(struct snd_pcm_substream *substream,
 static int skl_platform_soc_get_time_info(
                        struct snd_soc_component *component,
                        struct snd_pcm_substream *substream,
-                       struct timespec *system_ts, struct timespec *audio_ts,
+                       struct timespec64 *system_ts, struct timespec64 *audio_ts,
                        struct snd_pcm_audio_tstamp_config *audio_tstamp_config,
                        struct snd_pcm_audio_tstamp_report *audio_tstamp_report)
 {
@@ -1276,7 +1276,7 @@ static int skl_platform_soc_get_time_info(
                if (audio_tstamp_config->report_delay)
                        nsec = skl_adjust_codec_delay(substream, nsec);
 
-               *audio_ts = ns_to_timespec(nsec);
+               *audio_ts = ns_to_timespec64(nsec);
 
                audio_tstamp_report->actual_type = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK;
                audio_tstamp_report->accuracy_report = 1; /* rest of struct is valid */