Author: andreast
Date: Sun Nov  8 21:06:51 2015
New Revision: 290557
URL: https://svnweb.freebsd.org/changeset/base/290557

Log:
  Improve r290373, do a runtime check rather than a compile time switch. I
  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@

Modified:
  head/sys/dev/ofw/ofw_iicbus.c

Modified: head/sys/dev/ofw/ofw_iicbus.c
==============================================================================
--- head/sys/dev/ofw/ofw_iicbus.c       Sun Nov  8 20:56:04 2015        
(r290556)
+++ head/sys/dev/ofw/ofw_iicbus.c       Sun Nov  8 21:06:51 2015        
(r290557)
@@ -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);
@@ -125,6 +129,21 @@ ofw_iicbus_attach(device_t 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.
         */
        for (child = OF_child(node); child != 0; child = OF_peer(child)) {
@@ -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);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to