Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 141817
b: refs/heads/master
c: 2dcec7a
h: refs/heads/master
i:
  141815: 86c7af1
v: v3
  • Loading branch information
Magnus Damm authored and Paul Mundt committed Apr 2, 2009
1 parent f56583c commit 6524939
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f7dd2548c471b1c7758611f6cd6393367d7ff649
refs/heads/master: 2dcec7a988a1895540460a0bf5603bab63d5a3ed
65 changes: 65 additions & 0 deletions trunk/drivers/sh/intc.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
#include <linux/interrupt.h>
#include <linux/bootmem.h>
#include <linux/sh_intc.h>
#include <linux/sysdev.h>
#include <linux/list.h>

#define _INTC_MK(fn, mode, addr_e, addr_d, width, shift) \
((shift) | ((width) << 5) | ((fn) << 9) | ((mode) << 13) | \
Expand All @@ -40,6 +42,8 @@ struct intc_handle_int {
};

struct intc_desc_int {
struct list_head list;
struct sys_device sysdev;
unsigned long *reg;
#ifdef CONFIG_SMP
unsigned long *smp;
Expand All @@ -52,6 +56,8 @@ struct intc_desc_int {
struct irq_chip chip;
};

static LIST_HEAD(intc_list);

#ifdef CONFIG_SMP
#define IS_SMP(x) x.smp
#define INTC_REG(d, x, c) (d->reg[(x)] + ((d->smp[(x)] & 0xff) * c))
Expand Down Expand Up @@ -232,6 +238,11 @@ static void intc_disable(unsigned int irq)
}
}

static int intc_set_wake(unsigned int irq, unsigned int on)
{
return 0; /* allow wakeup, but setup hardware in intc_suspend() */
}

#if defined(CONFIG_CPU_SH3) || defined(CONFIG_CPU_SH4A)
static void intc_mask_ack(unsigned int irq)
{
Expand Down Expand Up @@ -664,6 +675,9 @@ void __init register_intc_controller(struct intc_desc *desc)

d = alloc_bootmem(sizeof(*d));

INIT_LIST_HEAD(&d->list);
list_add(&d->list, &intc_list);

d->nr_reg = desc->mask_regs ? desc->nr_mask_regs * 2 : 0;
d->nr_reg += desc->prio_regs ? desc->nr_prio_regs * 2 : 0;
d->nr_reg += desc->sense_regs ? desc->nr_sense_regs : 0;
Expand Down Expand Up @@ -711,6 +725,7 @@ void __init register_intc_controller(struct intc_desc *desc)
d->chip.disable = intc_disable;
d->chip.shutdown = intc_disable;
d->chip.set_type = intc_set_sense;
d->chip.set_wake = intc_set_wake;

#if defined(CONFIG_CPU_SH3) || defined(CONFIG_CPU_SH4A)
if (desc->ack_regs) {
Expand Down Expand Up @@ -761,3 +776,53 @@ void __init register_intc_controller(struct intc_desc *desc)
intc_register_irq(desc, d, vect->enum_id, evt2irq(vect->vect));
}
}

static int intc_suspend(struct sys_device *dev, pm_message_t state)
{
struct intc_desc_int *d;
struct irq_desc *desc;
int irq;

/* get intc controller associated with this sysdev */
d = container_of(dev, struct intc_desc_int, sysdev);

/* enable wakeup irqs belonging to this intc controller */
for_each_irq_desc(irq, desc) {
if ((desc->status & IRQ_WAKEUP) && (desc->chip == &d->chip))
intc_enable(irq);
}

return 0;
}

static struct sysdev_class intc_sysdev_class = {
.name = "intc",
.suspend = intc_suspend,
};

/* register this intc as sysdev to allow suspend/resume */
static int __init register_intc_sysdevs(void)
{
struct intc_desc_int *d;
int error;
int id = 0;

error = sysdev_class_register(&intc_sysdev_class);
if (!error) {
list_for_each_entry(d, &intc_list, list) {
d->sysdev.id = id;
d->sysdev.cls = &intc_sysdev_class;
error = sysdev_register(&d->sysdev);
if (error)
break;
id++;
}
}

if (error)
pr_warning("intc: sysdev registration error\n");

return error;
}

device_initcall(register_intc_sysdevs);

0 comments on commit 6524939

Please sign in to comment.