Commit fa7a0449 authored by Richard Weinberger's avatar Richard Weinberger

um: Implement um_free_irq()

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: default avatarRichard Weinberger <richard@nod.at>
Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 2b76ebaa
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <linux/tty_flip.h> #include <linux/tty_flip.h>
#include "chan.h" #include "chan.h"
#include "os.h" #include "os.h"
#include "irq_kern.h"
#ifdef CONFIG_NOCONFIG_CHAN #ifdef CONFIG_NOCONFIG_CHAN
static void *not_configged_init(char *str, int device, static void *not_configged_init(char *str, int device,
...@@ -213,9 +214,9 @@ void free_irqs(void) ...@@ -213,9 +214,9 @@ void free_irqs(void)
chan = list_entry(ele, struct chan, free_list); chan = list_entry(ele, struct chan, free_list);
if (chan->input && chan->enabled) 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) 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; chan->enabled = 0;
} }
} }
...@@ -234,9 +235,9 @@ static void close_one_chan(struct chan *chan, int delay_free_irq) ...@@ -234,9 +235,9 @@ static void close_one_chan(struct chan *chan, int delay_free_irq)
} }
else { else {
if (chan->input && chan->enabled) 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) 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; chan->enabled = 0;
} }
if (chan->ops->close != NULL) if (chan->ops->close != NULL)
......
...@@ -699,7 +699,7 @@ struct winch { ...@@ -699,7 +699,7 @@ struct winch {
static void __free_winch(struct work_struct *work) static void __free_winch(struct work_struct *work)
{ {
struct winch *winch = container_of(work, struct winch, 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) if (winch->pid != -1)
os_kill_process(winch->pid, 1); os_kill_process(winch->pid, 1);
......
...@@ -195,7 +195,7 @@ static int uml_net_close(struct net_device *dev) ...@@ -195,7 +195,7 @@ static int uml_net_close(struct net_device *dev)
netif_stop_queue(dev); netif_stop_queue(dev);
free_irq(dev->irq, dev); um_free_irq(dev->irq, dev);
if (lp->close != NULL) if (lp->close != NULL)
(*lp->close)(lp->fd, &lp->user); (*lp->close)(lp->fd, &lp->user);
lp->fd = -1; lp->fd = -1;
...@@ -835,7 +835,7 @@ static void close_devices(void) ...@@ -835,7 +835,7 @@ static void close_devices(void)
spin_lock(&opened_lock); spin_lock(&opened_lock);
list_for_each(ele, &opened) { list_for_each(ele, &opened) {
lp = list_entry(ele, struct uml_net_private, list); 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)) if ((lp->close != NULL) && (lp->fd >= 0))
(*lp->close)(lp->fd, &lp->user); (*lp->close)(lp->fd, &lp->user);
if (lp->remove != NULL) if (lp->remove != NULL)
......
...@@ -254,7 +254,7 @@ int port_wait(void *data) ...@@ -254,7 +254,7 @@ int port_wait(void *data)
* connection. Then we loop here throwing out failed * connection. Then we loop here throwing out failed
* connections until a good one is found. * connections until a good one is found.
*/ */
free_irq(TELNETD_IRQ, conn); um_free_irq(TELNETD_IRQ, conn);
if (conn->fd >= 0) if (conn->fd >= 0)
break; break;
......
...@@ -65,7 +65,7 @@ int xterm_fd(int socket, int *pid_out) ...@@ -65,7 +65,7 @@ int xterm_fd(int socket, int *pid_out)
* isn't set) this will hang... */ * isn't set) this will hang... */
wait_for_completion(&data->ready); wait_for_completion(&data->ready);
free_irq(XTERM_IRQ, data); um_free_irq(XTERM_IRQ, data);
ret = data->new_fd; ret = data->new_fd;
*pid_out = data->pid; *pid_out = data->pid;
......
...@@ -13,6 +13,6 @@ extern int um_request_irq(unsigned int irq, int fd, int type, ...@@ -13,6 +13,6 @@ extern int um_request_irq(unsigned int irq, int fd, int type,
irq_handler_t handler, irq_handler_t handler,
unsigned long irqflags, const char * devname, unsigned long irqflags, const char * devname,
void *dev_id); void *dev_id);
void um_free_irq(unsigned int irq, void *dev);
#endif #endif
...@@ -297,6 +297,13 @@ unsigned int do_IRQ(int irq, struct uml_pt_regs *regs) ...@@ -297,6 +297,13 @@ unsigned int do_IRQ(int irq, struct uml_pt_regs *regs)
return 1; 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, int um_request_irq(unsigned int irq, int fd, int type,
irq_handler_t handler, irq_handler_t handler,
unsigned long irqflags, const char * devname, unsigned long irqflags, const char * devname,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment