Module Name: src Committed By: martin Date: Sun Feb 28 11:35:40 UTC 2010
Modified Files: src/sys/dev/ofw: ofw_subr.c openfirm.h Log Message: Supporting cast for i2c direct configuration on OF machines To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/sys/dev/ofw/ofw_subr.c cvs rdiff -u -r1.27 -r1.28 src/sys/dev/ofw/openfirm.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/ofw/ofw_subr.c diff -u src/sys/dev/ofw/ofw_subr.c:1.16 src/sys/dev/ofw/ofw_subr.c:1.17 --- src/sys/dev/ofw/ofw_subr.c:1.16 Thu Jan 21 15:56:08 2010 +++ src/sys/dev/ofw/ofw_subr.c Sun Feb 28 11:35:40 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: ofw_subr.c,v 1.16 2010/01/21 15:56:08 martin Exp $ */ +/* $NetBSD: ofw_subr.c,v 1.17 2010/02/28 11:35:40 martin Exp $ */ /* * Copyright 1998 @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ofw_subr.c,v 1.16 2010/01/21 15:56:08 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ofw_subr.c,v 1.17 2010/02/28 11:35:40 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -325,3 +325,60 @@ strncpy(buffer, pos + 2, len); return buffer; } + +/* + * Iterate over the subtree of a i2c controller node. + * Add all sub-devices into an array as part of the controller's + * device properties. + * This is used by the i2c bus attach code to do direct configuration. + */ +void +of_enter_i2c_devs(prop_dictionary_t props, int ofnode) +{ + int node, len; + char name[32]; + uint64_t r64; + uint64_t r32; + uint8_t smr[24]; + prop_array_t array; + prop_dictionary_t dev; + + array = prop_array_create(); + + for (node = OF_child(ofnode); node; node = OF_peer(node)) { + if (OF_getprop(node, "name", name, sizeof(name)) <= 0) + continue; + len = OF_getproplen(node, "reg"); + if (len == sizeof(r64)) { + if (OF_getprop(node, "reg", &r64, sizeof(r64)) + != sizeof(r64)) + continue; + r32 = r64; + } else if (len == sizeof(r32)) { + if (OF_getprop(node, "reg", &r32, sizeof(r32)) + != sizeof(r32)) + continue; + } else if (len == 24) { + if (OF_getprop(node, "reg", smr, sizeof(smr)) + != sizeof(smr)) + continue; + /* smbus reg property */ + r32 = smr[7]; + } else { + panic("unexpected \"reg\" size %d for \"%s\", " + "parent %x, node %x", + len, name, ofnode, node); + } + + dev = prop_dictionary_create(); + prop_dictionary_set_cstring(dev, "name", name); + prop_dictionary_set_uint32(dev, "addr", r32 >> 1); + prop_dictionary_set_uint64(dev, "cookie", node); + of_to_dataprop(dev, node, "compatible", "compatible"); + prop_array_add(array, dev); + prop_object_release(dev); + } + + prop_dictionary_set(props, "i2c-child-devices", array); + prop_object_release(array); +} Index: src/sys/dev/ofw/openfirm.h diff -u src/sys/dev/ofw/openfirm.h:1.27 src/sys/dev/ofw/openfirm.h:1.28 --- src/sys/dev/ofw/openfirm.h:1.27 Wed Nov 11 16:56:52 2009 +++ src/sys/dev/ofw/openfirm.h Sun Feb 28 11:35:40 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: openfirm.h,v 1.27 2009/11/11 16:56:52 macallan Exp $ */ +/* $NetBSD: openfirm.h,v 1.28 2010/02/28 11:35:40 martin Exp $ */ /* * Copyright (C) 1995, 1996 Wolfgang Solfrank. @@ -115,4 +115,6 @@ int *of_network_decode_media(int, int *, int *); char *of_get_mode_string(char *, int); +void of_enter_i2c_devs(prop_dictionary_t, int); + #endif /*_OPENFIRM_H_*/