aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl3
-rw-r--r--include/sound/core.h23
-rw-r--r--include/sound/pcm.h3
-rw-r--r--sound/core/pcm_lib.c2
-rw-r--r--sound/core/pcm_native.c14
-rw-r--r--sound/core/timer.c6
6 files changed, 10 insertions, 41 deletions
diff --git a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl
index f3a2fdca9ad2..ab3dfe074fb1 100644
--- a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl
+++ b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl
@@ -2190,8 +2190,7 @@ struct _snd_pcm_runtime {
2190 unsigned int rate_den; 2190 unsigned int rate_den;
2191 2191
2192 /* -- SW params -- */ 2192 /* -- SW params -- */
2193 int tstamp_timespec; /* use timeval (0) or timespec (1) */ 2193 struct timespec tstamp_mode; /* mmap timestamp is updated */
2194 snd_pcm_tstamp_t tstamp_mode; /* mmap timestamp is updated */
2195 unsigned int period_step; 2194 unsigned int period_step;
2196 unsigned int sleep_min; /* min ticks to sleep */ 2195 unsigned int sleep_min; /* min ticks to sleep */
2197 snd_pcm_uframes_t xfer_align; /* xfer size need to be a multiple */ 2196 snd_pcm_uframes_t xfer_align; /* xfer size need to be a multiple */
diff --git a/include/sound/core.h b/include/sound/core.h
index f0f54407fe5c..fa8f4c9492cc 100644
--- a/include/sound/core.h
+++ b/include/sound/core.h
@@ -29,7 +29,6 @@
29#include <linux/pm.h> /* pm_message_t */ 29#include <linux/pm.h> /* pm_message_t */
30 30
31/* Typedef's */ 31/* Typedef's */
32typedef struct timespec snd_timestamp_t;
33typedef struct sndrv_interval snd_interval_t; 32typedef struct sndrv_interval snd_interval_t;
34typedef enum sndrv_card_type snd_card_type; 33typedef enum sndrv_card_type snd_card_type;
35typedef struct sndrv_xferi snd_xferi_t; 34typedef struct sndrv_xferi snd_xferi_t;
@@ -464,28 +463,6 @@ void snd_verbose_printd(const char *file, int line, const char *format, ...)
464#endif 463#endif
465 464
466 465
467static inline void snd_timestamp_now(struct timespec *tstamp, int timespec)
468{
469 struct timeval val;
470 /* FIXME: use a linear time source */
471 do_gettimeofday(&val);
472 tstamp->tv_sec = val.tv_sec;
473 tstamp->tv_nsec = val.tv_usec;
474 if (timespec)
475 tstamp->tv_nsec *= 1000L;
476}
477
478static inline void snd_timestamp_zero(struct timespec *tstamp)
479{
480 tstamp->tv_sec = 0;
481 tstamp->tv_nsec = 0;
482}
483
484static inline int snd_timestamp_null(struct timespec *tstamp)
485{
486 return tstamp->tv_sec == 0 && tstamp->tv_nsec == 0;
487}
488
489#define SNDRV_OSS_VERSION ((3<<16)|(8<<8)|(1<<4)|(0)) /* 3.8.1a */ 466#define SNDRV_OSS_VERSION ((3<<16)|(8<<8)|(1<<4)|(0)) /* 3.8.1a */
490 467
491/* for easier backward-porting */ 468/* for easier backward-porting */
diff --git a/include/sound/pcm.h b/include/sound/pcm.h
index 2b23a5967071..acc4fa9d5abe 100644
--- a/include/sound/pcm.h
+++ b/include/sound/pcm.h
@@ -281,7 +281,7 @@ typedef struct {
281struct _snd_pcm_runtime { 281struct _snd_pcm_runtime {
282 /* -- Status -- */ 282 /* -- Status -- */
283 snd_pcm_substream_t *trigger_master; 283 snd_pcm_substream_t *trigger_master;
284 snd_timestamp_t trigger_tstamp; /* trigger timestamp */ 284 struct timespec trigger_tstamp; /* trigger timestamp */
285 int overrange; 285 int overrange;
286 snd_pcm_uframes_t avail_max; 286 snd_pcm_uframes_t avail_max;
287 snd_pcm_uframes_t hw_ptr_base; /* Position at buffer restart */ 287 snd_pcm_uframes_t hw_ptr_base; /* Position at buffer restart */
@@ -306,7 +306,6 @@ struct _snd_pcm_runtime {
306 unsigned int rate_den; 306 unsigned int rate_den;
307 307
308 /* -- SW params -- */ 308 /* -- SW params -- */
309 int tstamp_timespec; /* use timeval (0) or timespec (1) */
310 snd_pcm_tstamp_t tstamp_mode; /* mmap timestamp is updated */ 309 snd_pcm_tstamp_t tstamp_mode; /* mmap timestamp is updated */
311 unsigned int period_step; 310 unsigned int period_step;
312 unsigned int sleep_min; /* min ticks to sleep */ 311 unsigned int sleep_min; /* min ticks to sleep */
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
index dfc5f45f2748..3dbf9bf2ac16 100644
--- a/sound/core/pcm_lib.c
+++ b/sound/core/pcm_lib.c
@@ -152,7 +152,7 @@ static inline snd_pcm_uframes_t snd_pcm_update_hw_ptr_pos(snd_pcm_substream_t *s
152 if (pos == SNDRV_PCM_POS_XRUN) 152 if (pos == SNDRV_PCM_POS_XRUN)
153 return pos; /* XRUN */ 153 return pos; /* XRUN */
154 if (runtime->tstamp_mode & SNDRV_PCM_TSTAMP_MMAP) 154 if (runtime->tstamp_mode & SNDRV_PCM_TSTAMP_MMAP)
155 snd_timestamp_now((snd_timestamp_t*)&runtime->status->tstamp, runtime->tstamp_timespec); 155 getnstimeofday((struct timespec *)&runtime->status->tstamp);
156#ifdef CONFIG_SND_DEBUG 156#ifdef CONFIG_SND_DEBUG
157 if (pos >= runtime->buffer_size) { 157 if (pos >= runtime->buffer_size) {
158 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); 158 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);
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index e6e2b70314c0..a1924f12d8fc 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -565,9 +565,9 @@ int snd_pcm_status(snd_pcm_substream_t *substream,
565 if (runtime->tstamp_mode & SNDRV_PCM_TSTAMP_MMAP) 565 if (runtime->tstamp_mode & SNDRV_PCM_TSTAMP_MMAP)
566 status->tstamp = runtime->status->tstamp; 566 status->tstamp = runtime->status->tstamp;
567 else 567 else
568 snd_timestamp_now(&status->tstamp, runtime->tstamp_timespec); 568 getnstimeofday(&status->tstamp);
569 } else 569 } else
570 snd_timestamp_now(&status->tstamp, runtime->tstamp_timespec); 570 getnstimeofday(&status->tstamp);
571 status->appl_ptr = runtime->control->appl_ptr; 571 status->appl_ptr = runtime->control->appl_ptr;
572 status->hw_ptr = runtime->status->hw_ptr; 572 status->hw_ptr = runtime->status->hw_ptr;
573 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 573 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
@@ -652,7 +652,7 @@ static void snd_pcm_trigger_tstamp(snd_pcm_substream_t *substream)
652 if (runtime->trigger_master == NULL) 652 if (runtime->trigger_master == NULL)
653 return; 653 return;
654 if (runtime->trigger_master == substream) { 654 if (runtime->trigger_master == substream) {
655 snd_timestamp_now(&runtime->trigger_tstamp, runtime->tstamp_timespec); 655 getnstimeofday(&runtime->trigger_tstamp);
656 } else { 656 } else {
657 snd_pcm_trigger_tstamp(runtime->trigger_master); 657 snd_pcm_trigger_tstamp(runtime->trigger_master);
658 runtime->trigger_tstamp = runtime->trigger_master->runtime->trigger_tstamp; 658 runtime->trigger_tstamp = runtime->trigger_master->runtime->trigger_tstamp;
@@ -2446,14 +2446,8 @@ static int snd_pcm_common_ioctl1(snd_pcm_substream_t *substream,
2446 return put_user(SNDRV_PCM_VERSION, (int __user *)arg) ? -EFAULT : 0; 2446 return put_user(SNDRV_PCM_VERSION, (int __user *)arg) ? -EFAULT : 0;
2447 case SNDRV_PCM_IOCTL_INFO: 2447 case SNDRV_PCM_IOCTL_INFO:
2448 return snd_pcm_info_user(substream, arg); 2448 return snd_pcm_info_user(substream, arg);
2449 case SNDRV_PCM_IOCTL_TSTAMP: 2449 case SNDRV_PCM_IOCTL_TSTAMP: /* just for compatibility */
2450 {
2451 int xarg;
2452 if (get_user(xarg, (int __user *)arg))
2453 return -EFAULT;
2454 substream->runtime->tstamp_timespec = xarg ? 1 : 0;
2455 return 0; 2450 return 0;
2456 }
2457 case SNDRV_PCM_IOCTL_HW_REFINE: 2451 case SNDRV_PCM_IOCTL_HW_REFINE:
2458 return snd_pcm_hw_refine_user(substream, arg); 2452 return snd_pcm_hw_refine_user(substream, arg);
2459 case SNDRV_PCM_IOCTL_HW_PARAMS: 2453 case SNDRV_PCM_IOCTL_HW_PARAMS:
diff --git a/sound/core/timer.c b/sound/core/timer.c
index 128916c66085..8ecec9134acd 100644
--- a/sound/core/timer.c
+++ b/sound/core/timer.c
@@ -385,7 +385,7 @@ static void snd_timer_notify1(snd_timer_instance_t *ti, enum sndrv_timer_event e
385 struct list_head *n; 385 struct list_head *n;
386 struct timespec tstamp; 386 struct timespec tstamp;
387 387
388 snd_timestamp_now(&tstamp, 1); 388 getnstimeofday(&tstamp);
389 snd_assert(event >= SNDRV_TIMER_EVENT_START && event <= SNDRV_TIMER_EVENT_PAUSE, return); 389 snd_assert(event >= SNDRV_TIMER_EVENT_START && event <= SNDRV_TIMER_EVENT_PAUSE, return);
390 if (event == SNDRV_TIMER_EVENT_START || event == SNDRV_TIMER_EVENT_CONTINUE) 390 if (event == SNDRV_TIMER_EVENT_START || event == SNDRV_TIMER_EVENT_CONTINUE)
391 resolution = snd_timer_resolution(ti); 391 resolution = snd_timer_resolution(ti);
@@ -1156,14 +1156,14 @@ static void snd_timer_user_tinterrupt(snd_timer_instance_t *timeri,
1156 struct timespec tstamp; 1156 struct timespec tstamp;
1157 int prev, append = 0; 1157 int prev, append = 0;
1158 1158
1159 snd_timestamp_zero(&tstamp); 1159 memset(&tstamp, 0, sizeof(tstamp));
1160 spin_lock(&tu->qlock); 1160 spin_lock(&tu->qlock);
1161 if ((tu->filter & ((1 << SNDRV_TIMER_EVENT_RESOLUTION)|(1 << SNDRV_TIMER_EVENT_TICK))) == 0) { 1161 if ((tu->filter & ((1 << SNDRV_TIMER_EVENT_RESOLUTION)|(1 << SNDRV_TIMER_EVENT_TICK))) == 0) {
1162 spin_unlock(&tu->qlock); 1162 spin_unlock(&tu->qlock);
1163 return; 1163 return;
1164 } 1164 }
1165 if (tu->last_resolution != resolution || ticks > 0) 1165 if (tu->last_resolution != resolution || ticks > 0)
1166 snd_timestamp_now(&tstamp, 1); 1166 getnstimeofday(&tstamp);
1167 if ((tu->filter & (1 << SNDRV_TIMER_EVENT_RESOLUTION)) && tu->last_resolution != resolution) { 1167 if ((tu->filter & (1 << SNDRV_TIMER_EVENT_RESOLUTION)) && tu->last_resolution != resolution) {
1168 r1.event = SNDRV_TIMER_EVENT_RESOLUTION; 1168 r1.event = SNDRV_TIMER_EVENT_RESOLUTION;
1169 r1.tstamp = tstamp; 1169 r1.tstamp = tstamp;