Skip to content

Commit

Permalink
[PARPORT] Consolidate code copies into a single generic irq handler
Browse files Browse the repository at this point in the history
Several arches used the exact same code for their parport irq handling.
Make that code generic, in parport_irq_handler().

Also, s/__inline__/inline/ in include/linux/parport.h.

Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
  • Loading branch information
Jeff Garzik committed Oct 23, 2007
1 parent 01e7ae8 commit 3f2e40d
Show file tree
Hide file tree
Showing 9 changed files with 25 additions and 50 deletions.
9 changes: 1 addition & 8 deletions drivers/parport/parport_amiga.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,13 +137,6 @@ static unsigned char amiga_read_status(struct parport *p)
return status;
}

/* as this ports irq handling is already done, we use a generic funktion */
static irqreturn_t amiga_interrupt(int irq, void *dev_id)
{
parport_generic_irq(irq, (struct parport *) dev_id);
return IRQ_HANDLED;
}

static void amiga_enable_irq(struct parport *p)
{
enable_irq(IRQ_AMIGA_CIAA_FLG);
Expand Down Expand Up @@ -255,7 +248,7 @@ static int __init parport_amiga_init(void)
if (!p)
goto out_port;

err = request_irq(IRQ_AMIGA_CIAA_FLG, amiga_interrupt, 0, p->name, p);
err = request_irq(IRQ_AMIGA_CIAA_FLG, parport_irq_handler, 0, p->name, p);
if (err)
goto out_irq;

Expand Down
9 changes: 1 addition & 8 deletions drivers/parport/parport_atari.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,13 +103,6 @@ parport_atari_restore_state(struct parport *p, struct parport_state *s)
{
}

static irqreturn_t
parport_atari_interrupt(int irq, void *dev_id)
{
parport_generic_irq(irq, (struct parport *) dev_id);
return IRQ_HANDLED;
}

static void
parport_atari_enable_irq(struct parport *p)
{
Expand Down Expand Up @@ -208,7 +201,7 @@ static int __init parport_atari_init(void)
&parport_atari_ops);
if (!p)
return -ENODEV;
if (request_irq(IRQ_MFP_BUSY, parport_atari_interrupt,
if (request_irq(IRQ_MFP_BUSY, parport_irq_handler,
IRQ_TYPE_SLOW, p->name, p)) {
parport_put_port (p);
return -ENODEV;
Expand Down
10 changes: 1 addition & 9 deletions drivers/parport/parport_ax88796.c
Original file line number Diff line number Diff line change
Expand Up @@ -232,14 +232,6 @@ parport_ax88796_restore_state(struct parport *p, struct parport_state *s)
writeb(s->u.ax88796.cpr, dd->spp_cpr);
}

static irqreturn_t
parport_ax88796_interrupt(int irq, void *dev_id)
{
parport_generic_irq(irq, dev_id);
return IRQ_HANDLED;
}


static struct parport_operations parport_ax88796_ops = {
.write_data = parport_ax88796_write_data,
.read_data = parport_ax88796_read_data,
Expand Down Expand Up @@ -344,7 +336,7 @@ static int parport_ax88796_probe(struct platform_device *pdev)

if (irq >= 0) {
/* request irq */
ret = request_irq(irq, parport_ax88796_interrupt,
ret = request_irq(irq, parport_irq_handler,
IRQF_TRIGGER_FALLING, pdev->name, pp);

if (ret < 0)
Expand Down
8 changes: 1 addition & 7 deletions drivers/parport/parport_gsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,6 @@ static int clear_epp_timeout(struct parport *pb)
* of these are in parport_gsc.h.
*/

static irqreturn_t parport_gsc_interrupt(int irq, void *dev_id)
{
parport_generic_irq(irq, (struct parport *) dev_id);
return IRQ_HANDLED;
}

void parport_gsc_init_state(struct pardevice *dev, struct parport_state *s)
{
s->u.pc.ctr = 0xc | (dev->irq_func ? 0x10 : 0x0);
Expand Down Expand Up @@ -324,7 +318,7 @@ struct parport *__devinit parport_gsc_probe_port (unsigned long base,
printk("]\n");

if (p->irq != PARPORT_IRQ_NONE) {
if (request_irq (p->irq, parport_gsc_interrupt,
if (request_irq (p->irq, parport_irq_handler,
0, p->name, p)) {
printk (KERN_WARNING "%s: irq %d in use, "
"resorting to polled operation\n",
Expand Down
6 changes: 4 additions & 2 deletions drivers/parport/parport_ip32.c
Original file line number Diff line number Diff line change
Expand Up @@ -778,14 +778,16 @@ static irqreturn_t parport_ip32_interrupt(int irq, void *dev_id)
struct parport * const p = dev_id;
struct parport_ip32_private * const priv = p->physport->private_data;
enum parport_ip32_irq_mode irq_mode = priv->irq_mode;

switch (irq_mode) {
case PARPORT_IP32_IRQ_FWD:
parport_generic_irq(irq, p);
break;
return parport_irq_handler(irq, dev_id);

case PARPORT_IP32_IRQ_HERE:
parport_ip32_wakeup(p);
break;
}

return IRQ_HANDLED;
}

Expand Down
9 changes: 1 addition & 8 deletions drivers/parport/parport_pc.c
Original file line number Diff line number Diff line change
Expand Up @@ -272,13 +272,6 @@ static int clear_epp_timeout(struct parport *pb)
* of these are in parport_pc.h.
*/

static irqreturn_t parport_pc_interrupt(int irq, void *dev_id)
{
parport_generic_irq(irq, (struct parport *) dev_id);
/* FIXME! Was it really ours? */
return IRQ_HANDLED;
}

static void parport_pc_init_state(struct pardevice *dev, struct parport_state *s)
{
s->u.pc.ctr = 0xc;
Expand Down Expand Up @@ -2301,7 +2294,7 @@ struct parport *parport_pc_probe_port (unsigned long int base,
EPP_res = NULL;
}
if (p->irq != PARPORT_IRQ_NONE) {
if (request_irq (p->irq, parport_pc_interrupt,
if (request_irq (p->irq, parport_irq_handler,
0, p->name, p)) {
printk (KERN_WARNING "%s: irq %d in use, "
"resorting to polled operation\n",
Expand Down
8 changes: 1 addition & 7 deletions drivers/parport/parport_sunbpp.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,6 @@
#define dprintk(x)
#endif

static irqreturn_t parport_sunbpp_interrupt(int irq, void *dev_id)
{
parport_generic_irq(irq, (struct parport *) dev_id);
return IRQ_HANDLED;
}

static void parport_sunbpp_disable_irq(struct parport *p)
{
struct bpp_regs __iomem *regs = (struct bpp_regs __iomem *)p->base;
Expand Down Expand Up @@ -324,7 +318,7 @@ static int __devinit init_one_port(struct sbus_dev *sdev)
p->size = size;
p->dev = &sdev->ofdev.dev;

if ((err = request_irq(p->irq, parport_sunbpp_interrupt,
if ((err = request_irq(p->irq, parport_irq_handler,
IRQF_SHARED, p->name, p)) != 0) {
goto out_put_port;
}
Expand Down
10 changes: 10 additions & 0 deletions drivers/parport/share.c
Original file line number Diff line number Diff line change
Expand Up @@ -995,6 +995,15 @@ void parport_release(struct pardevice *dev)
}
}

irqreturn_t parport_irq_handler(int irq, void *dev_id)
{
struct parport *port = dev_id;

parport_generic_irq(irq, port);

return IRQ_HANDLED;
}

/* Exported symbols for modules. */

EXPORT_SYMBOL(parport_claim);
Expand All @@ -1011,5 +1020,6 @@ EXPORT_SYMBOL(parport_get_port);
EXPORT_SYMBOL(parport_put_port);
EXPORT_SYMBOL(parport_find_number);
EXPORT_SYMBOL(parport_find_base);
EXPORT_SYMBOL(parport_irq_handler);

MODULE_LICENSE("GPL");
6 changes: 5 additions & 1 deletion include/linux/parport.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ typedef enum {
#include <linux/proc_fs.h>
#include <linux/spinlock.h>
#include <linux/wait.h>
#include <linux/irqreturn.h>
#include <asm/system.h>
#include <asm/ptrace.h>
#include <asm/semaphore.h>
Expand Down Expand Up @@ -366,6 +367,9 @@ extern void parport_unregister_driver (struct parport_driver *);
extern struct parport *parport_find_number (int);
extern struct parport *parport_find_base (unsigned long);

/* generic irq handler, if it suits your needs */
extern irqreturn_t parport_irq_handler(int irq, void *dev_id);

/* Reference counting for ports. */
extern struct parport *parport_get_port (struct parport *);
extern void parport_put_port (struct parport *);
Expand Down Expand Up @@ -514,7 +518,7 @@ extern void parport_daisy_deselect_all (struct parport *port);
extern int parport_daisy_select (struct parport *port, int daisy, int mode);

/* Lowlevel drivers _can_ call this support function to handle irqs. */
static __inline__ void parport_generic_irq(int irq, struct parport *port)
static inline void parport_generic_irq(int irq, struct parport *port)
{
parport_ieee1284_interrupt (irq, port);
read_lock(&port->cad_lock);
Expand Down

0 comments on commit 3f2e40d

Please sign in to comment.