unsigned int rate_den;
 
        /* -- SW params -- */
-       int tstamp_timespec;            /* use timeval (0) or timespec (1) */
-       snd_pcm_tstamp_t tstamp_mode;   /* mmap timestamp is updated */
+       struct timespec tstamp_mode;    /* mmap timestamp is updated */
        unsigned int period_step;
        unsigned int sleep_min;         /* min ticks to sleep */
        snd_pcm_uframes_t xfer_align;   /* xfer size need to be a multiple */
 
 #include <linux/pm.h>                  /* pm_message_t */
 
 /* Typedef's */
-typedef struct timespec snd_timestamp_t;
 typedef struct sndrv_interval snd_interval_t;
 typedef enum sndrv_card_type snd_card_type;
 typedef struct sndrv_xferi snd_xferi_t;
 #endif
 
 
-static inline void snd_timestamp_now(struct timespec *tstamp, int timespec)
-{
-       struct timeval val;
-       /* FIXME: use a linear time source */
-       do_gettimeofday(&val);
-       tstamp->tv_sec = val.tv_sec;
-       tstamp->tv_nsec = val.tv_usec;
-       if (timespec)
-               tstamp->tv_nsec *= 1000L;
-}
-
-static inline void snd_timestamp_zero(struct timespec *tstamp)
-{
-       tstamp->tv_sec = 0;
-       tstamp->tv_nsec = 0;
-}
-
-static inline int snd_timestamp_null(struct timespec *tstamp)
-{
-       return tstamp->tv_sec == 0 && tstamp->tv_nsec == 0;
-}
-
 #define SNDRV_OSS_VERSION         ((3<<16)|(8<<8)|(1<<4)|(0))  /* 3.8.1a */
 
 /* for easier backward-porting */
 
 struct _snd_pcm_runtime {
        /* -- Status -- */
        snd_pcm_substream_t *trigger_master;
-       snd_timestamp_t trigger_tstamp; /* trigger timestamp */
+       struct timespec trigger_tstamp; /* trigger timestamp */
        int overrange;
        snd_pcm_uframes_t avail_max;
        snd_pcm_uframes_t hw_ptr_base;  /* Position at buffer restart */
        unsigned int rate_den;
 
        /* -- SW params -- */
-       int tstamp_timespec;            /* use timeval (0) or timespec (1) */
        snd_pcm_tstamp_t tstamp_mode;   /* mmap timestamp is updated */
        unsigned int period_step;
        unsigned int sleep_min;         /* min ticks to sleep */
 
        if (pos == SNDRV_PCM_POS_XRUN)
                return pos; /* XRUN */
        if (runtime->tstamp_mode & SNDRV_PCM_TSTAMP_MMAP)
-               snd_timestamp_now((snd_timestamp_t*)&runtime->status->tstamp, runtime->tstamp_timespec);
+               getnstimeofday((struct timespec *)&runtime->status->tstamp);
 #ifdef CONFIG_SND_DEBUG
        if (pos >= runtime->buffer_size) {
                snd_printk(KERN_ERR  "BUG: stream = %i, pos = 0x%lx, buffer size = 0x%lx, period size = 0x%lx\n", substream->stream, pos, runtime->buffer_size, runtime->period_size);
 
                if (runtime->tstamp_mode & SNDRV_PCM_TSTAMP_MMAP)
                        status->tstamp = runtime->status->tstamp;
                else
-                       snd_timestamp_now(&status->tstamp, runtime->tstamp_timespec);
+                       getnstimeofday(&status->tstamp);
        } else
-               snd_timestamp_now(&status->tstamp, runtime->tstamp_timespec);
+               getnstimeofday(&status->tstamp);
        status->appl_ptr = runtime->control->appl_ptr;
        status->hw_ptr = runtime->status->hw_ptr;
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
        if (runtime->trigger_master == NULL)
                return;
        if (runtime->trigger_master == substream) {
-               snd_timestamp_now(&runtime->trigger_tstamp, runtime->tstamp_timespec);
+               getnstimeofday(&runtime->trigger_tstamp);
        } else {
                snd_pcm_trigger_tstamp(runtime->trigger_master);
                runtime->trigger_tstamp = runtime->trigger_master->runtime->trigger_tstamp;
                return put_user(SNDRV_PCM_VERSION, (int __user *)arg) ? -EFAULT : 0;
        case SNDRV_PCM_IOCTL_INFO:
                return snd_pcm_info_user(substream, arg);
-       case SNDRV_PCM_IOCTL_TSTAMP:
-       {
-               int xarg;
-               if (get_user(xarg, (int __user *)arg))
-                       return -EFAULT;
-               substream->runtime->tstamp_timespec = xarg ? 1 : 0;
+       case SNDRV_PCM_IOCTL_TSTAMP: /* just for compatibility */
                return 0;
-       }
        case SNDRV_PCM_IOCTL_HW_REFINE:
                return snd_pcm_hw_refine_user(substream, arg);
        case SNDRV_PCM_IOCTL_HW_PARAMS:
 
        struct list_head *n;
        struct timespec tstamp;
 
-       snd_timestamp_now(&tstamp, 1);
+       getnstimeofday(&tstamp);
        snd_assert(event >= SNDRV_TIMER_EVENT_START && event <= SNDRV_TIMER_EVENT_PAUSE, return);
        if (event == SNDRV_TIMER_EVENT_START || event == SNDRV_TIMER_EVENT_CONTINUE)
                resolution = snd_timer_resolution(ti);
        struct timespec tstamp;
        int prev, append = 0;
 
-       snd_timestamp_zero(&tstamp);
+       memset(&tstamp, 0, sizeof(tstamp));
        spin_lock(&tu->qlock);
        if ((tu->filter & ((1 << SNDRV_TIMER_EVENT_RESOLUTION)|(1 << SNDRV_TIMER_EVENT_TICK))) == 0) {
                spin_unlock(&tu->qlock);
                return;
        }
        if (tu->last_resolution != resolution || ticks > 0)
-               snd_timestamp_now(&tstamp, 1);
+               getnstimeofday(&tstamp);
        if ((tu->filter & (1 << SNDRV_TIMER_EVENT_RESOLUTION)) && tu->last_resolution != resolution) {
                r1.event = SNDRV_TIMER_EVENT_RESOLUTION;
                r1.tstamp = tstamp;