Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
9649745c
Commit
9649745c
authored
Dec 25, 2008
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'topic/snd-hrtimer' into to-push
parents
a9c3c7e0
5e03c54e
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
182 additions
and
1 deletion
+182
-1
include/sound/asound.h
include/sound/asound.h
+1
-0
sound/core/Kconfig
sound/core/Kconfig
+21
-0
sound/core/Makefile
sound/core/Makefile
+2
-0
sound/core/hrtimer.c
sound/core/hrtimer.c
+155
-0
sound/core/seq/seq.c
sound/core/seq/seq.c
+3
-1
No files found.
include/sound/asound.h
View file @
9649745c
...
...
@@ -575,6 +575,7 @@ enum {
#define SNDRV_TIMER_GLOBAL_SYSTEM 0
#define SNDRV_TIMER_GLOBAL_RTC 1
#define SNDRV_TIMER_GLOBAL_HPET 2
#define SNDRV_TIMER_GLOBAL_HRTIMER 3
/* info flags */
#define SNDRV_TIMER_FLG_SLAVE (1<<0)
/* cannot be controlled */
...
...
sound/core/Kconfig
View file @
9649745c
...
...
@@ -95,6 +95,26 @@ config SND_SEQUENCER_OSS
this will be compiled as a module. The module will be called
snd-seq-oss.
config SND_HRTIMER
tristate "HR-timer backend support"
depends on HIGH_RES_TIMERS
select SND_TIMER
help
Say Y here to enable HR-timer backend for ALSA timer. ALSA uses
the hrtimer as a precise timing source. The ALSA sequencer code
also can use this timing source.
To compile this driver as a module, choose M here: the module
will be called snd-hrtimer.
config SND_SEQ_HRTIMER_DEFAULT
bool "Use HR-timer as default sequencer timer"
depends on SND_HRTIMER && SND_SEQUENCER
default y
help
Say Y here to use the HR-timer backend as the default sequencer
timer.
config SND_RTCTIMER
tristate "RTC Timer support"
depends on RTC
...
...
@@ -114,6 +134,7 @@ config SND_RTCTIMER
config SND_SEQ_RTCTIMER_DEFAULT
bool "Use RTC as default sequencer timer"
depends on SND_RTCTIMER && SND_SEQUENCER
depends on !SND_SEQ_HRTIMER_DEFAULT
default y
help
Say Y here to use the RTC timer as the default sequencer
...
...
sound/core/Makefile
View file @
9649745c
...
...
@@ -17,12 +17,14 @@ snd-page-alloc-$(CONFIG_HAS_DMA) += sgbuf.o
snd-rawmidi-objs
:=
rawmidi.o
snd-timer-objs
:=
timer.o
snd-hrtimer-objs
:=
hrtimer.o
snd-rtctimer-objs
:=
rtctimer.o
snd-hwdep-objs
:=
hwdep.o
obj-$(CONFIG_SND)
+=
snd.o
obj-$(CONFIG_SND_HWDEP)
+=
snd-hwdep.o
obj-$(CONFIG_SND_TIMER)
+=
snd-timer.o
obj-$(CONFIG_SND_HRTIMER)
+=
snd-hrtimer.o
obj-$(CONFIG_SND_RTCTIMER)
+=
snd-rtctimer.o
obj-$(CONFIG_SND_PCM)
+=
snd-pcm.o snd-page-alloc.o
obj-$(CONFIG_SND_RAWMIDI)
+=
snd-rawmidi.o
...
...
sound/core/hrtimer.c
0 → 100644
View file @
9649745c
/*
* ALSA timer back-end using hrtimer
* Copyright (C) 2008 Takashi Iwai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/hrtimer.h>
#include <sound/core.h>
#include <sound/timer.h>
MODULE_AUTHOR
(
"Takashi Iwai <tiwai@suse.de>"
);
MODULE_DESCRIPTION
(
"ALSA hrtimer backend"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_ALIAS
(
"snd-timer-"
__stringify
(
SNDRV_TIMER_GLOBAL_HRTIMER
));
#define NANO_SEC 1000000000UL
/* 10^9 in sec */
static
unsigned
int
resolution
;
struct
snd_hrtimer
{
struct
snd_timer
*
timer
;
struct
hrtimer
hrt
;
};
static
enum
hrtimer_restart
snd_hrtimer_callback
(
struct
hrtimer
*
hrt
)
{
struct
snd_hrtimer
*
stime
=
container_of
(
hrt
,
struct
snd_hrtimer
,
hrt
);
struct
snd_timer
*
t
=
stime
->
timer
;
hrtimer_forward_now
(
hrt
,
ns_to_ktime
(
t
->
sticks
*
resolution
));
snd_timer_interrupt
(
stime
->
timer
,
t
->
sticks
);
return
HRTIMER_RESTART
;
}
static
int
snd_hrtimer_open
(
struct
snd_timer
*
t
)
{
struct
snd_hrtimer
*
stime
;
stime
=
kmalloc
(
sizeof
(
*
stime
),
GFP_KERNEL
);
if
(
!
stime
)
return
-
ENOMEM
;
hrtimer_init
(
&
stime
->
hrt
,
CLOCK_MONOTONIC
,
HRTIMER_MODE_REL
);
stime
->
timer
=
t
;
stime
->
hrt
.
cb_mode
=
HRTIMER_CB_IRQSAFE_UNLOCKED
;
stime
->
hrt
.
function
=
snd_hrtimer_callback
;
t
->
private_data
=
stime
;
return
0
;
}
static
int
snd_hrtimer_close
(
struct
snd_timer
*
t
)
{
struct
snd_hrtimer
*
stime
=
t
->
private_data
;
if
(
stime
)
{
hrtimer_cancel
(
&
stime
->
hrt
);
kfree
(
stime
);
t
->
private_data
=
NULL
;
}
return
0
;
}
static
int
snd_hrtimer_start
(
struct
snd_timer
*
t
)
{
struct
snd_hrtimer
*
stime
=
t
->
private_data
;
hrtimer_start
(
&
stime
->
hrt
,
ns_to_ktime
(
t
->
sticks
*
resolution
),
HRTIMER_MODE_REL
);
return
0
;
}
static
int
snd_hrtimer_stop
(
struct
snd_timer
*
t
)
{
struct
snd_hrtimer
*
stime
=
t
->
private_data
;
hrtimer_cancel
(
&
stime
->
hrt
);
return
0
;
}
static
struct
snd_timer_hardware
hrtimer_hw
=
{
.
flags
=
SNDRV_TIMER_HW_AUTO
,
.
open
=
snd_hrtimer_open
,
.
close
=
snd_hrtimer_close
,
.
start
=
snd_hrtimer_start
,
.
stop
=
snd_hrtimer_stop
,
};
/*
* entry functions
*/
static
struct
snd_timer
*
mytimer
;
static
int
__init
snd_hrtimer_init
(
void
)
{
struct
snd_timer
*
timer
;
struct
timespec
tp
;
int
err
;
hrtimer_get_res
(
CLOCK_MONOTONIC
,
&
tp
);
if
(
tp
.
tv_sec
>
0
||
!
tp
.
tv_nsec
)
{
snd_printk
(
KERN_ERR
"snd-hrtimer: Invalid resolution %u.%09u"
,
(
unsigned
)
tp
.
tv_sec
,
(
unsigned
)
tp
.
tv_nsec
);
return
-
EINVAL
;
}
resolution
=
tp
.
tv_nsec
;
/* Create a new timer and set up the fields */
err
=
snd_timer_global_new
(
"hrtimer"
,
SNDRV_TIMER_GLOBAL_HRTIMER
,
&
timer
);
if
(
err
<
0
)
return
err
;
timer
->
module
=
THIS_MODULE
;
strcpy
(
timer
->
name
,
"HR timer"
);
timer
->
hw
=
hrtimer_hw
;
timer
->
hw
.
resolution
=
resolution
;
timer
->
hw
.
ticks
=
NANO_SEC
/
resolution
;
err
=
snd_timer_global_register
(
timer
);
if
(
err
<
0
)
{
snd_timer_global_free
(
timer
);
return
err
;
}
mytimer
=
timer
;
/* remember this */
return
0
;
}
static
void
__exit
snd_hrtimer_exit
(
void
)
{
if
(
mytimer
)
{
snd_timer_global_free
(
mytimer
);
mytimer
=
NULL
;
}
}
module_init
(
snd_hrtimer_init
);
module_exit
(
snd_hrtimer_exit
);
sound/core/seq/seq.c
View file @
9649745c
...
...
@@ -43,7 +43,9 @@ int seq_default_timer_class = SNDRV_TIMER_CLASS_GLOBAL;
int
seq_default_timer_sclass
=
SNDRV_TIMER_SCLASS_NONE
;
int
seq_default_timer_card
=
-
1
;
int
seq_default_timer_device
=
#ifdef CONFIG_SND_SEQ_RTCTIMER_DEFAULT
#ifdef CONFIG_SND_SEQ_HRTIMER_DEFAULT
SNDRV_TIMER_GLOBAL_HRTIMER
#elif defined(CONFIG_SND_SEQ_RTCTIMER_DEFAULT)
SNDRV_TIMER_GLOBAL_RTC
#else
SNDRV_TIMER_GLOBAL_SYSTEM
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment