svn commit: r233472 - stable/9/sys/powerpc/powermac

Andreas Tobler andreast at FreeBSD.org
Sun Mar 25 18:43:15 UTC 2012


Author: andreast
Date: Sun Mar 25 18:43:14 2012
New Revision: 233472
URL: http://svn.freebsd.org/changeset/base/233472

Log:
  MFC: r233188
  Provide a fix for certain PowerMacs where the U3 i2c lacks the interrupt
  info.

Modified:
  stable/9/sys/powerpc/powermac/uninorth.c

Modified: stable/9/sys/powerpc/powermac/uninorth.c
==============================================================================
--- stable/9/sys/powerpc/powermac/uninorth.c	Sun Mar 25 18:42:19 2012	(r233471)
+++ stable/9/sys/powerpc/powermac/uninorth.c	Sun Mar 25 18:43:14 2012	(r233472)
@@ -262,9 +262,11 @@ unin_chip_attach(device_t dev)
 	struct unin_chip_devinfo *dinfo;
 	phandle_t  root;
 	phandle_t  child;
+	phandle_t  iparent;
 	device_t   cdev;
 	char compat[32];
-	u_int reg[3];
+	char name[32];
+	u_int irq, reg[3];
 	int error, i = 0;
 
 	sc = device_get_softc(dev);
@@ -315,6 +317,33 @@ unin_chip_attach(device_t dev)
 		dinfo->udi_ninterrupts = 0;
 		unin_chip_add_intr(child, dinfo);
 
+		/*
+		 * Some Apple machines do have a bug in OF, they miss
+		 * the interrupt entries on the U3 I2C node. That means they
+		 * do not have an entry with number of interrupts nor the
+		 * entry of the interrupt parent handle.
+		 * We define an interrupt and hardwire it to the /u3/mpic
+		 * handle.
+		 */
+
+		if (OF_getprop(child, "name", name, sizeof(name)) <= 0)
+			device_printf(dev, "device has no name!\n");
+		if (dinfo->udi_ninterrupts == 0 &&
+		    (strcmp(name, "i2c-bus") == 0 ||
+		     strcmp(name, "i2c")  == 0)) {
+			if (OF_getprop(child, "interrupt-parent", &iparent,
+				       sizeof(iparent)) <= 0) {
+				iparent = OF_finddevice("/u3/mpic");
+				device_printf(dev, "Set /u3/mpic as iparent!\n");
+			}
+			/* Add an interrupt number 0 to the parent. */
+			irq = MAP_IRQ(iparent, 0);
+			resource_list_add(&dinfo->udi_resources, SYS_RES_IRQ,
+					  dinfo->udi_ninterrupts, irq, irq, 1);
+			dinfo->udi_interrupts[dinfo->udi_ninterrupts] = irq;
+			dinfo->udi_ninterrupts++;
+		}
+
 		unin_chip_add_reg(child, dinfo);
 
 		cdev = device_add_child(dev, NULL, -1);


More information about the svn-src-stable mailing list