]> xenbits.xensource.com Git - people/liuw/freebsd.git/commitdiff
Improve r290373, do a runtime check rather than a compile time switch. I
authorandreast <andreast@FreeBSD.org>
Sun, 8 Nov 2015 21:06:51 +0000 (21:06 +0000)
committerandreast <andreast@FreeBSD.org>
Sun, 8 Nov 2015 21:06:51 +0000 (21:06 +0000)
learned that the Power8 and the PS3 have a mix of OFW and FDT. Both have AIM
defined. But currently they are not affected. They have no I2C devices under
OFW.

This version was tested on a Quad G5 and build tested for armv6*.

Discussed with nwhitehorn@
Reviewed by: ian@

sys/dev/ofw/ofw_iicbus.c

index badefed68477095d32d3311cfa346e26fc1ffd11..e27cc09c2366d73cf9de6b44aa2a9bbe7804bdc0 100644 (file)
@@ -101,9 +101,13 @@ ofw_iicbus_attach(device_t dev)
 {
        struct iicbus_softc *sc = IICBUS_SOFTC(dev);
        struct ofw_iicbus_devinfo *dinfo;
-       phandle_t child, node;
+       phandle_t child, node, root;
        pcell_t freq, paddr;
        device_t childdev;
+       ssize_t compatlen;
+       char compat[255];
+       char *curstr;
+       u_int iic_addr_8bit = 0;
 
        sc->dev = dev;
        mtx_init(&sc->lock, "iicbus", NULL, MTX_DEF);
@@ -124,6 +128,21 @@ ofw_iicbus_attach(device_t dev)
        bus_generic_probe(dev);
        bus_enumerate_hinted_children(dev);
 
+       /*
+        * Check if we're running on a PowerMac, needed for the I2C
+        * address below.
+        */
+       root = OF_peer(0);
+       compatlen = OF_getprop(root, "compatible", compat,
+                               sizeof(compat));
+       if (compatlen != -1) {
+           for (curstr = compat; curstr < compat + compatlen;
+               curstr += strlen(curstr) + 1) {
+               if (strncmp(curstr, "MacRISC", 7) == 0)
+                   iic_addr_8bit = 1;
+           }
+       }
+
        /*
         * Attach those children represented in the device tree.
         */
@@ -153,11 +172,11 @@ ofw_iicbus_attach(device_t dev)
                 * Linux FDT data contains 7-bit values, so shift them up to
                 * 8-bit format.
                 */
-#ifdef AIM
-               dinfo->opd_dinfo.addr = paddr;
-#else
-               dinfo->opd_dinfo.addr = paddr << 1;
-#endif
+               if (iic_addr_8bit)
+                   dinfo->opd_dinfo.addr = paddr;
+               else
+                   dinfo->opd_dinfo.addr = paddr << 1;
+
                if (ofw_bus_gen_setup_devinfo(&dinfo->opd_obdinfo, child) !=
                    0) {
                        free(dinfo, M_DEVBUF);