[PATCH] parallel port init fix

Michael Neuling mikey at neuling.org
Wed Jan 11 12:08:56 EST 2006


Paulus,

Please merge.  

The Cell guys have been reporting crashes without this patch.  It's
also needed when we merge Anton's remove_io_page mask patch.

We'll also eventually need dwmw2 patch for parallel ports which are
partially configured in the SuperIO registers, but the attached patch
can go in without it.  His patch is here:
 http://patchwork.ozlabs.org/linuxppc64/patch?id=3669

Mikey
---
Signed-off-by: Michael Neuling <mikey at neuling.org>

Patch stops parport from accessing non existant ports.

 include/asm-powerpc/parport.h |   28 ++++++++++++++++++++++++++--
 1 files changed, 26 insertions(+), 2 deletions(-)

Index: linux-2.6-powerpc-latest.nobackup/include/asm-powerpc/parport.h
===================================================================
--- linux-2.6-powerpc-latest.nobackup.orig/include/asm-powerpc/parport.h
+++ linux-2.6-powerpc-latest.nobackup/include/asm-powerpc/parport.h
@@ -10,10 +10,34 @@
 #define _ASM_POWERPC_PARPORT_H
 #ifdef __KERNEL__
 
-static int __devinit parport_pc_find_isa_ports (int autoirq, int autodma);
+#include <asm/prom.h>
+
+extern struct parport *parport_pc_probe_port (unsigned long int base,
+                                              unsigned long int base_hi,
+                                              int irq, int dma,
+                                              struct pci_dev *dev);
+
 static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma)
 {
-	return parport_pc_find_isa_ports (autoirq, autodma);
+	struct device_node *np;
+	u32 *prop;
+	u32 io1, io2;
+	int propsize;
+	int count = 0;
+	for (np = NULL; (np = of_find_compatible_node(np,
+						      "parallel",
+						      "pnpPNP,400")) != NULL;) {
+		prop = (u32 *)get_property(np, "reg", &propsize);
+		if (!prop || propsize > 6*sizeof(u32))
+			continue;
+		io1 = prop[1]; io2 = prop[2];
+		prop = (u32 *)get_property(np, "interrupts", NULL);
+		if (!prop)
+			continue;
+		if (parport_pc_probe_port(io1, io2, prop[0], autodma, NULL) != NULL)
+			count++;
+	}
+	return count;
 }
 
 #endif /* __KERNEL__ */



More information about the Linuxppc64-dev mailing list