diff options
author | Gregory Haskins <ghaskins@novell.com> | 2009-12-07 11:46:43 -0500 |
---|---|---|
committer | Gregory Haskins <ghaskins@novell.com> | 2009-12-07 11:46:43 -0500 |
commit | c26611d3e5894961a085e28225e7d3f43bbcaa6d (patch) | |
tree | a009ea3d8fce9a8c154cec44b789c5c32a34a48c /drivers/vbus | |
parent | 14a6625cff213cdc90d532672206a417ffe88456 (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.c | 69 |
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 |