svn commit: r290557 - head/sys/dev/ofw
Andreas Tobler
andreast at FreeBSD.org
Sun Nov 8 21:06:53 UTC 2015
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);
More information about the svn-src-head
mailing list