um: Implement um_free_irq()
authorRichard Weinberger <richard@nod.at>
Tue, 17 Apr 2012 20:37:13 +0000 (22:37 +0200)
committerRichard Weinberger <richard@nod.at>
Mon, 21 May 2012 19:09:36 +0000 (21:09 +0200)
Instead of using chip->release() we can achieve the same
using a simple wrapper for free_irq().
We have already um_request_irq(), so um_free_irq() is the perfect
counterpart.

Signed-off-by: Richard Weinberger <richard@nod.at>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
arch/um/drivers/chan_kern.c
arch/um/drivers/line.c
arch/um/drivers/net_kern.c
arch/um/drivers/port_kern.c
arch/um/drivers/xterm_kern.c
arch/um/include/shared/irq_kern.h
arch/um/kernel/irq.c

index ca4c7ebfd0aa592141021d779f1d49feac0f33a2..45e248c2f43c7c1c8c618aea0eb41980fd28a046 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/tty_flip.h>
 #include "chan.h"
 #include "os.h"
+#include "irq_kern.h"
 
 #ifdef CONFIG_NOCONFIG_CHAN
 static void *not_configged_init(char *str, int device,
@@ -213,9 +214,9 @@ void free_irqs(void)
                chan = list_entry(ele, struct chan, free_list);
 
                if (chan->input && chan->enabled)
-                       free_irq(chan->line->driver->read_irq, chan);
+                       um_free_irq(chan->line->driver->read_irq, chan);
                if (chan->output && chan->enabled)
-                       free_irq(chan->line->driver->write_irq, chan);
+                       um_free_irq(chan->line->driver->write_irq, chan);
                chan->enabled = 0;
        }
 }
@@ -234,9 +235,9 @@ static void close_one_chan(struct chan *chan, int delay_free_irq)
        }
        else {
                if (chan->input && chan->enabled)
-                       free_irq(chan->line->driver->read_irq, chan);
+                       um_free_irq(chan->line->driver->read_irq, chan);
                if (chan->output && chan->enabled)
-                       free_irq(chan->line->driver->write_irq, chan);
+                       um_free_irq(chan->line->driver->write_irq, chan);
                chan->enabled = 0;
        }
        if (chan->ops->close != NULL)
index 4ab0d9c0911c7bd6fe42ac7369211ef1f4914d07..acfd0e0fd0c98cfcabe626581eea0a722c86b6ff 100644 (file)
@@ -699,7 +699,7 @@ struct winch {
 static void __free_winch(struct work_struct *work)
 {
        struct winch *winch = container_of(work, struct winch, work);
-       free_irq(WINCH_IRQ, winch);
+       um_free_irq(WINCH_IRQ, winch);
 
        if (winch->pid != -1)
                os_kill_process(winch->pid, 1);
index 95f4416e6d9f3574b2a2b85acf6ff6b858fa344a..0d60c5685c2655505a0a0b7c2ed63d19e4b679a8 100644 (file)
@@ -195,7 +195,7 @@ static int uml_net_close(struct net_device *dev)
 
        netif_stop_queue(dev);
 
-       free_irq(dev->irq, dev);
+       um_free_irq(dev->irq, dev);
        if (lp->close != NULL)
                (*lp->close)(lp->fd, &lp->user);
        lp->fd = -1;
@@ -835,7 +835,7 @@ static void close_devices(void)
        spin_lock(&opened_lock);
        list_for_each(ele, &opened) {
                lp = list_entry(ele, struct uml_net_private, list);
-               free_irq(lp->dev->irq, lp->dev);
+               um_free_irq(lp->dev->irq, lp->dev);
                if ((lp->close != NULL) && (lp->fd >= 0))
                        (*lp->close)(lp->fd, &lp->user);
                if (lp->remove != NULL)
index e31680e662a473eeee0d4e62543110b533b6d70d..11866ffd45a988c24da3b38c07d806f2f5f2e1c5 100644 (file)
@@ -254,7 +254,7 @@ int port_wait(void *data)
                 * connection.  Then we loop here throwing out failed
                 * connections until a good one is found.
                 */
-               free_irq(TELNETD_IRQ, conn);
+               um_free_irq(TELNETD_IRQ, conn);
 
                if (conn->fd >= 0)
                        break;
index 8bd130f0bda351e4295752f0d2d1c8e451752330..b68bbe269e018cb00154781eec3706060e1b1c8d 100644 (file)
@@ -65,7 +65,7 @@ int xterm_fd(int socket, int *pid_out)
         * isn't set) this will hang... */
        wait_for_completion(&data->ready);
 
-       free_irq(XTERM_IRQ, data);
+       um_free_irq(XTERM_IRQ, data);
 
        ret = data->new_fd;
        *pid_out = data->pid;
index b05d22f3d84e2450420a38adf8f641a106d5e236..7a5bfa6291b807c039ab5f150e357266b415b414 100644 (file)
@@ -13,6 +13,6 @@ extern int um_request_irq(unsigned int irq, int fd, int type,
                          irq_handler_t handler,
                          unsigned long irqflags,  const char * devname,
                          void *dev_id);
-
+void um_free_irq(unsigned int irq, void *dev);
 #endif
 
index 71b8c947e5efde749730ee3c8844b860dab15b4c..47a09eea49edf18a0fa2b9eccd1731ebd6c35d47 100644 (file)
@@ -297,6 +297,13 @@ unsigned int do_IRQ(int irq, struct uml_pt_regs *regs)
        return 1;
 }
 
+void um_free_irq(unsigned int irq, void *dev)
+{
+       free_irq_by_irq_and_dev(irq, dev);
+       free_irq(irq, dev);
+}
+EXPORT_SYMBOL(um_free_irq);
+
 int um_request_irq(unsigned int irq, int fd, int type,
                   irq_handler_t handler,
                   unsigned long irqflags, const char * devname,