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: Richard Weinberger <richard@nod.at> Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
@@ -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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
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 {
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
* 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)
|
|||||||
* 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,
|
|||||||
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)
|
|||||||
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,
|
||||||
|
|||||||
Reference in New Issue
Block a user