summaryrefslogtreecommitdiff
path: root/drivers/vbus
diff options
context:
space:
mode:
authorGregory Haskins <ghaskins@novell.com>2009-12-07 11:46:43 -0500
committerGregory Haskins <ghaskins@novell.com>2009-12-07 11:46:43 -0500
commitc26611d3e5894961a085e28225e7d3f43bbcaa6d (patch)
treea009ea3d8fce9a8c154cec44b789c5c32a34a48c /drivers/vbus
parent14a6625cff213cdc90d532672206a417ffe88456 (diff)
vbus: remove create_irq() references from the pcibridge
We cannot rely on create_irq() being available in all circumstances, therefore lets remove it from the code for now until we can figure out a way to support it with config options. Signed-off-by: Gregory Haskins <ghaskins@novell.com>
Diffstat (limited to 'drivers/vbus')
-rw-r--r--drivers/vbus/pci-bridge.c69
1 files changed, 26 insertions, 43 deletions
diff --git a/drivers/vbus/pci-bridge.c b/drivers/vbus/pci-bridge.c
index 5af0732eaaf9..add1cc37e1f9 100644
--- a/drivers/vbus/pci-bridge.c
+++ b/drivers/vbus/pci-bridge.c
@@ -186,6 +186,8 @@ static struct shm_signal_ops _signal_ops = {
.release = _signal_release,
};
+static void shmsignal_disconnect(struct _signal *_signal);
+
/*
* -------------------
* vbus_device_proxy routines
@@ -233,8 +235,7 @@ vbus_pci_device_close(struct vbus_device_proxy *vdev, int flags)
_signal = list_first_entry(&dev->shms, struct _signal, list);
list_del(&_signal->list);
- free_irq(_signal->irq, _signal);
- destroy_irq(_signal->irq);
+ shmsignal_disconnect(_signal);
spin_unlock_irqrestore(&vbus_pci.lock, iflags);
shm_signal_put(&_signal->signal);
@@ -260,25 +261,30 @@ vbus_pci_device_close(struct vbus_device_proxy *vdev, int flags)
return 0;
}
-static void vbus_irq_chip_noop(unsigned int irq)
+/*
+ * -------------------
+ * shmsignal interrupt routines
+ * -------------------
+ */
+
+/* We abstract these routines so that we can drop in irqchip later */
+
+static void
+shmsignal_wakeup(struct _signal *_signal)
{
+ _shm_signal_wakeup(&_signal->signal);
}
-static struct irq_chip vbus_irq_chip = {
- .name = "VBUS",
- .mask = vbus_irq_chip_noop,
- .unmask = vbus_irq_chip_noop,
- .eoi = vbus_irq_chip_noop,
-};
-
-irqreturn_t
-shm_signal_intr(int irq, void *dev)
+static int
+shmsignal_connect(struct _signal *_signal)
{
- struct _signal *_signal = (struct _signal *)dev;
+ return 0;
+}
- _shm_signal_wakeup(&_signal->signal);
+static void
+shmsignal_disconnect(struct _signal *_signal)
+{
- return IRQ_HANDLED;
}
static int
@@ -340,45 +346,22 @@ vbus_pci_device_shm(struct vbus_device_proxy *vdev, const char *name,
goto fail;
if (signal) {
- int irq;
BUG_ON(ret < 0);
_signal->handle = ret;
- irq = create_irq();
- if (irq < 0) {
- printk(KERN_ERR "Failed to create IRQ: %d\n", irq);
- ret = -ENOSPC;
- goto fail;
- }
-
- _signal->irq = irq;
- _signal->desc = irq_to_desc(irq);
-
- set_irq_chip_and_handler_name(irq,
- &vbus_irq_chip,
- handle_percpu_irq,
- "edge");
-
if (!name)
snprintf(_signal->name, sizeof(_signal->name),
- "dev%lld-id%d", vdev->id, id);
+ "dev%lld-id%d", vdev->id, id);
else
snprintf(_signal->name, sizeof(_signal->name),
- "%s", name);
+ "%s", name);
- ret = request_irq(irq, shm_signal_intr, 0,
- _signal->name, _signal);
- if (ret) {
- printk(KERN_ERR "Failed to request irq: %d\n", irq);
- goto fail;
- }
+ shmsignal_connect(_signal);
spin_lock_irqsave(&vbus_pci.lock, iflags);
-
list_add_tail(&_signal->list, &dev->shms);
-
spin_unlock_irqrestore(&vbus_pci.lock, iflags);
shm_signal_get(&_signal->signal);
@@ -529,10 +512,10 @@ static void
event_shmsignal(struct vbus_pci_handle_event *event)
{
struct _signal *_signal = (struct _signal *)(unsigned long)event->handle;
- struct irq_desc *desc = _signal->desc;
vbus_pci.stats.notify++;
- desc->handle_irq(_signal->irq, desc);
+
+ shmsignal_wakeup(_signal);
}
static void