Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 151205
b: refs/heads/master
c: 8dca419
h: refs/heads/master
i:
  151203: f4ca32e
v: v3
  • Loading branch information
Takashi Iwai committed Jun 15, 2009
1 parent eed5d01 commit 1d60245
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 635c265f32d8a3f73402813d6a8dd47f2a363df5
refs/heads/master: 8dca419721d188bfee5f19fad45275856c619a5c
18 changes: 10 additions & 8 deletions trunk/sound/pci/ctxfi/cttimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ static inline unsigned int ct_xfitimer_get_wc(struct ct_timer *atimer)
*
* call this inside the lock and irq disabled
*/
static int ct_xfitimer_reprogram(struct ct_timer *atimer)
static int ct_xfitimer_reprogram(struct ct_timer *atimer, int can_update)
{
struct ct_timer_instance *ti;
unsigned int min_intr = (unsigned int)-1;
Expand Down Expand Up @@ -216,6 +216,8 @@ static int ct_xfitimer_reprogram(struct ct_timer *atimer)
ti->frag_count = div_u64((u64)pos * CT_TIMER_FREQ +
rate - 1, rate);
}
if (ti->need_update && !can_update)
min_intr = 0; /* pending to the next irq */
if (ti->frag_count < min_intr)
min_intr = ti->frag_count;
}
Expand All @@ -235,7 +237,7 @@ static void ct_xfitimer_check_period(struct ct_timer *atimer)

spin_lock_irqsave(&atimer->list_lock, flags);
list_for_each_entry(ti, &atimer->instance_head, instance_list) {
if (ti->need_update) {
if (ti->running && ti->need_update) {
ti->need_update = 0;
ti->apcm->interrupt(ti->apcm);
}
Expand All @@ -252,7 +254,7 @@ static void ct_xfitimer_callback(struct ct_timer *atimer)
spin_lock_irqsave(&atimer->lock, flags);
atimer->irq_handling = 1;
do {
update = ct_xfitimer_reprogram(atimer);
update = ct_xfitimer_reprogram(atimer, 1);
spin_unlock(&atimer->lock);
if (update)
ct_xfitimer_check_period(atimer);
Expand All @@ -265,6 +267,7 @@ static void ct_xfitimer_callback(struct ct_timer *atimer)
static void ct_xfitimer_prepare(struct ct_timer_instance *ti)
{
ti->frag_count = ti->substream->runtime->period_size;
ti->running = 0;
ti->need_update = 0;
}

Expand All @@ -273,7 +276,6 @@ static void ct_xfitimer_prepare(struct ct_timer_instance *ti)
static void ct_xfitimer_update(struct ct_timer *atimer)
{
unsigned long flags;
int update;

spin_lock_irqsave(&atimer->lock, flags);
if (atimer->irq_handling) {
Expand All @@ -284,10 +286,8 @@ static void ct_xfitimer_update(struct ct_timer *atimer)
}

ct_xfitimer_irq_stop(atimer);
update = ct_xfitimer_reprogram(atimer);
ct_xfitimer_reprogram(atimer, 0);
spin_unlock_irqrestore(&atimer->lock, flags);
if (update)
ct_xfitimer_check_period(atimer);
}

static void ct_xfitimer_start(struct ct_timer_instance *ti)
Expand All @@ -298,6 +298,8 @@ static void ct_xfitimer_start(struct ct_timer_instance *ti)
spin_lock_irqsave(&atimer->lock, flags);
if (list_empty(&ti->running_list))
atimer->wc = ct_xfitimer_get_wc(atimer);
ti->running = 1;
ti->need_update = 0;
list_add(&ti->running_list, &atimer->running_head);
spin_unlock_irqrestore(&atimer->lock, flags);
ct_xfitimer_update(atimer);
Expand All @@ -310,7 +312,7 @@ static void ct_xfitimer_stop(struct ct_timer_instance *ti)

spin_lock_irqsave(&atimer->lock, flags);
list_del_init(&ti->running_list);
ti->need_update = 0;
ti->running = 0;
spin_unlock_irqrestore(&atimer->lock, flags);
ct_xfitimer_update(atimer);
}
Expand Down

0 comments on commit 1d60245

Please sign in to comment.