Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 11903
b: refs/heads/master
c: 0d29086
h: refs/heads/master
i:
  11901: 2e134a1
  11899: 3f94642
  11895: aa23d1f
  11887: 63bbd08
  11871: 1060488
  11839: c30a76a
  11775: 5a178a5
v: v3
  • Loading branch information
Clemens Ladisch authored and Linus Torvalds committed Oct 31, 2005
1 parent 2a28eb0 commit 06145c4
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 8 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: 189e2dd1376c1eb2f3a717a15f1ed8c7d0b3811a
refs/heads/master: 0d29086177aaa1e7d14e6ebb7fc067b3ca6d5c11
28 changes: 21 additions & 7 deletions trunk/drivers/char/hpet.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ static struct hpets *hpets;
#define HPET_OPEN 0x0001
#define HPET_IE 0x0002 /* interrupt enabled */
#define HPET_PERIODIC 0x0004
#define HPET_SHARED_IRQ 0x0008

#if BITS_PER_LONG == 64
#define write_counter(V, MC) writeq(V, MC)
Expand Down Expand Up @@ -120,6 +121,11 @@ static irqreturn_t hpet_interrupt(int irq, void *data, struct pt_regs *regs)
unsigned long isr;

devp = data;
isr = 1 << (devp - devp->hd_hpets->hp_dev);

if ((devp->hd_flags & HPET_SHARED_IRQ) &&
!(isr & readl(&devp->hd_hpet->hpet_isr)))
return IRQ_NONE;

spin_lock(&hpet_lock);
devp->hd_irqdata++;
Expand All @@ -137,8 +143,8 @@ static irqreturn_t hpet_interrupt(int irq, void *data, struct pt_regs *regs)
&devp->hd_timer->hpet_compare);
}

isr = (1 << (devp - devp->hd_hpets->hp_dev));
writeq(isr, &devp->hd_hpet->hpet_isr);
if (devp->hd_flags & HPET_SHARED_IRQ)
writel(isr, &devp->hd_hpet->hpet_isr);
spin_unlock(&hpet_lock);

spin_lock(&hpet_task_lock);
Expand Down Expand Up @@ -375,15 +381,21 @@ static int hpet_ioctl_ieon(struct hpet_dev *devp)
}

devp->hd_flags |= HPET_IE;

if (readl(&timer->hpet_config) & Tn_INT_TYPE_CNF_MASK)
devp->hd_flags |= HPET_SHARED_IRQ;
spin_unlock_irq(&hpet_lock);

irq = devp->hd_hdwirq;

if (irq) {
sprintf(devp->hd_name, "hpet%d", (int)(devp - hpetp->hp_dev));
unsigned long irq_flags;

if (request_irq
(irq, hpet_interrupt, SA_INTERRUPT, devp->hd_name, (void *)devp)) {
sprintf(devp->hd_name, "hpet%d", (int)(devp - hpetp->hp_dev));
irq_flags = devp->hd_flags & HPET_SHARED_IRQ
? SA_SHIRQ : SA_INTERRUPT;
if (request_irq(irq, hpet_interrupt, irq_flags,
devp->hd_name, (void *)devp)) {
printk(KERN_ERR "hpet: IRQ %d is not free\n", irq);
irq = 0;
}
Expand Down Expand Up @@ -417,8 +429,10 @@ static int hpet_ioctl_ieon(struct hpet_dev *devp)
write_counter(t + m + hpetp->hp_delta, &timer->hpet_compare);
}

isr = (1 << (devp - hpets->hp_dev));
writeq(isr, &hpet->hpet_isr);
if (devp->hd_flags & HPET_SHARED_IRQ) {
isr = 1 << (devp - hpets->hp_dev);
writel(isr, &hpet->hpet_isr);
}
writeq(g, &timer->hpet_config);
local_irq_restore(flags);

Expand Down

0 comments on commit 06145c4

Please sign in to comment.