|
@@ -2170,10 +2170,11 @@ static int parport_dma_probe (struct parport *p)
|
|
|
static LIST_HEAD(ports_list);
|
|
|
static DEFINE_SPINLOCK(ports_lock);
|
|
|
|
|
|
-struct parport *parport_pc_probe_port (unsigned long int base,
|
|
|
- unsigned long int base_hi,
|
|
|
- int irq, int dma,
|
|
|
- struct device *dev)
|
|
|
+struct parport *parport_pc_probe_port(unsigned long int base,
|
|
|
+ unsigned long int base_hi,
|
|
|
+ int irq, int dma,
|
|
|
+ struct device *dev,
|
|
|
+ int irqflags)
|
|
|
{
|
|
|
struct parport_pc_private *priv;
|
|
|
struct parport_operations *ops;
|
|
@@ -2194,11 +2195,11 @@ struct parport *parport_pc_probe_port (unsigned long int base,
|
|
|
dev = &pdev->dev;
|
|
|
}
|
|
|
|
|
|
- ops = kmalloc(sizeof (struct parport_operations), GFP_KERNEL);
|
|
|
+ ops = kmalloc(sizeof(struct parport_operations), GFP_KERNEL);
|
|
|
if (!ops)
|
|
|
goto out1;
|
|
|
|
|
|
- priv = kmalloc (sizeof (struct parport_pc_private), GFP_KERNEL);
|
|
|
+ priv = kmalloc(sizeof(struct parport_pc_private), GFP_KERNEL);
|
|
|
if (!priv)
|
|
|
goto out2;
|
|
|
|
|
@@ -2325,8 +2326,8 @@ 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_irq_handler,
|
|
|
- 0, p->name, p)) {
|
|
|
+ if (request_irq(p->irq, parport_irq_handler,
|
|
|
+ irqflags, p->name, p)) {
|
|
|
printk (KERN_WARNING "%s: irq %d in use, "
|
|
|
"resorting to polled operation\n",
|
|
|
p->name, p->irq);
|
|
@@ -2530,7 +2531,7 @@ static int __devinit sio_ite_8872_probe (struct pci_dev *pdev, int autoirq,
|
|
|
*/
|
|
|
release_resource(base_res);
|
|
|
if (parport_pc_probe_port (ite8872_lpt, ite8872_lpthi,
|
|
|
- irq, PARPORT_DMA_NONE, &pdev->dev)) {
|
|
|
+ irq, PARPORT_DMA_NONE, &pdev->dev, 0)) {
|
|
|
printk (KERN_INFO
|
|
|
"parport_pc: ITE 8872 parallel port: io=0x%X",
|
|
|
ite8872_lpt);
|
|
@@ -2713,7 +2714,7 @@ static int __devinit sio_via_probe (struct pci_dev *pdev, int autoirq,
|
|
|
}
|
|
|
|
|
|
/* finally, do the probe with values obtained */
|
|
|
- if (parport_pc_probe_port (port1, port2, irq, dma, &pdev->dev)) {
|
|
|
+ if (parport_pc_probe_port (port1, port2, irq, dma, &pdev->dev, 0)) {
|
|
|
printk (KERN_INFO
|
|
|
"parport_pc: VIA parallel port: io=0x%X", port1);
|
|
|
if (irq != PARPORT_IRQ_NONE)
|
|
@@ -3018,6 +3019,7 @@ static int parport_pc_pci_probe (struct pci_dev *dev,
|
|
|
for (n = 0; n < cards[i].numports; n++) {
|
|
|
int lo = cards[i].addr[n].lo;
|
|
|
int hi = cards[i].addr[n].hi;
|
|
|
+ int irq;
|
|
|
unsigned long io_lo, io_hi;
|
|
|
io_lo = pci_resource_start (dev, lo);
|
|
|
io_hi = 0;
|
|
@@ -3028,13 +3030,25 @@ static int parport_pc_pci_probe (struct pci_dev *dev,
|
|
|
"hi" as an offset (see SYBA
|
|
|
def.) */
|
|
|
/* TODO: test if sharing interrupts works */
|
|
|
- printk (KERN_DEBUG "PCI parallel port detected: %04x:%04x, "
|
|
|
- "I/O at %#lx(%#lx)\n",
|
|
|
- parport_pc_pci_tbl[i + last_sio].vendor,
|
|
|
- parport_pc_pci_tbl[i + last_sio].device, io_lo, io_hi);
|
|
|
+ irq = dev->irq;
|
|
|
+ if (irq == IRQ_NONE) {
|
|
|
+ printk (KERN_DEBUG
|
|
|
+ "PCI parallel port detected: %04x:%04x, I/O at %#lx(%#lx)\n",
|
|
|
+ parport_pc_pci_tbl[i + last_sio].vendor,
|
|
|
+ parport_pc_pci_tbl[i + last_sio].device,
|
|
|
+ io_lo, io_hi);
|
|
|
+ irq = PARPORT_IRQ_NONE;
|
|
|
+ } else {
|
|
|
+ printk (KERN_DEBUG
|
|
|
+ "PCI parallel port detected: %04x:%04x, I/O at %#lx(%#lx), IRQ %d\n",
|
|
|
+ parport_pc_pci_tbl[i + last_sio].vendor,
|
|
|
+ parport_pc_pci_tbl[i + last_sio].device,
|
|
|
+ io_lo, io_hi, irq);
|
|
|
+ }
|
|
|
data->ports[count] =
|
|
|
- parport_pc_probe_port (io_lo, io_hi, PARPORT_IRQ_NONE,
|
|
|
- PARPORT_DMA_NONE, &dev->dev);
|
|
|
+ parport_pc_probe_port(io_lo, io_hi, irq,
|
|
|
+ PARPORT_DMA_NONE, &dev->dev,
|
|
|
+ IRQF_SHARED);
|
|
|
if (data->ports[count])
|
|
|
count++;
|
|
|
}
|
|
@@ -3143,7 +3157,8 @@ static int parport_pc_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id
|
|
|
dma = PARPORT_DMA_NONE;
|
|
|
|
|
|
dev_info(&dev->dev, "reported by %s\n", dev->protocol->name);
|
|
|
- if (!(pdata = parport_pc_probe_port (io_lo, io_hi, irq, dma, &dev->dev)))
|
|
|
+ if (!(pdata = parport_pc_probe_port(io_lo, io_hi,
|
|
|
+ irq, dma, &dev->dev, 0)))
|
|
|
return -ENODEV;
|
|
|
|
|
|
pnp_set_drvdata(dev,pdata);
|
|
@@ -3192,11 +3207,11 @@ parport_pc_find_isa_ports (int autoirq, int autodma)
|
|
|
{
|
|
|
int count = 0;
|
|
|
|
|
|
- if (parport_pc_probe_port(0x3bc, 0x7bc, autoirq, autodma, NULL))
|
|
|
+ if (parport_pc_probe_port(0x3bc, 0x7bc, autoirq, autodma, NULL, 0))
|
|
|
count++;
|
|
|
- if (parport_pc_probe_port(0x378, 0x778, autoirq, autodma, NULL))
|
|
|
+ if (parport_pc_probe_port(0x378, 0x778, autoirq, autodma, NULL, 0))
|
|
|
count++;
|
|
|
- if (parport_pc_probe_port(0x278, 0x678, autoirq, autodma, NULL))
|
|
|
+ if (parport_pc_probe_port(0x278, 0x678, autoirq, autodma, NULL, 0))
|
|
|
count++;
|
|
|
|
|
|
return count;
|
|
@@ -3481,7 +3496,7 @@ static int __init parport_pc_init(void)
|
|
|
if ((io_hi[i]) == PARPORT_IOHI_AUTO)
|
|
|
io_hi[i] = 0x400 + io[i];
|
|
|
parport_pc_probe_port(io[i], io_hi[i],
|
|
|
- irqval[i], dmaval[i], NULL);
|
|
|
+ irqval[i], dmaval[i], NULL, 0);
|
|
|
}
|
|
|
} else
|
|
|
parport_pc_find_ports (irqval[0], dmaval[0]);
|