32#include <sys/kernel.h>
33#include <sys/libkern.h>
35#include <sys/module.h>
40#include <dev/ofw/ofw_bus.h>
41#include <dev/ofw/ofw_bus_subr.h>
42#include <dev/ofw/openfirm.h>
45#include "ofw_iicbus_if.h"
51 const char *name,
int unit);
63 DEVMETHOD(bus_child_pnpinfo, ofw_bus_gen_child_pnpinfo),
68 DEVMETHOD(ofw_bus_get_compat, ofw_bus_gen_get_compat),
69 DEVMETHOD(ofw_bus_get_model, ofw_bus_gen_get_model),
70 DEVMETHOD(ofw_bus_get_name, ofw_bus_gen_get_name),
71 DEVMETHOD(ofw_bus_get_node, ofw_bus_gen_get_node),
72 DEVMETHOD(ofw_bus_get_type, ofw_bus_gen_get_type),
102 if (ofw_bus_get_node(
dev) == -1)
104 device_set_desc(
dev,
"OFW I2C bus");
114 phandle_t child, node, root;
120 u_int iic_addr_8bit = 0;
123 mtx_init(&sc->
lock,
"iicbus", NULL, MTX_DEF);
131 node = ofw_bus_get_node(
dev);
133 OF_getencprop(node,
"clock-frequency", &freq,
sizeof(freq));
138 bus_generic_probe(
dev);
139 bus_enumerate_hinted_children(
dev);
146 compatlen = OF_getprop(root,
"compatible", compat,
148 if (compatlen != -1) {
149 for (curstr = compat; curstr < compat + compatlen;
150 curstr += strlen(curstr) + 1) {
151 if (strncmp(curstr,
"MacRISC", 7) == 0)
159 for (child = OF_child(node); child != 0; child = OF_peer(child)) {
165 if (OF_getencprop(child,
"i2c-address", &paddr,
166 sizeof(paddr)) == -1)
167 if (OF_getencprop(child,
"reg", &paddr,
168 sizeof(paddr)) == -1)
190 if (ofw_bus_gen_setup_devinfo(&dinfo->
opd_obdinfo, child) !=
192 free(dinfo, M_DEVBUF);
196 childdev = device_add_child(
dev, NULL, -1);
198 ofw_bus_intr_to_rl(childdev, child,
200 device_set_ivars(childdev, dinfo);
204 OF_device_register_xref(OF_xref_from_node(node),
dev);
205 return (bus_generic_attach(
dev));
214 child = device_add_child_ordered(
dev, order, name, unit);
220 device_delete_child(
dev, child);
234 device_set_ivars(child, devi);
239static const struct ofw_bus_devinfo *
244 dinfo = device_get_ivars(
dev);
258 devi = device_get_ivars(
dev);
void iicbus_init_frequency(device_t dev, u_int bus_freq)
driver_t ofw_iicbus_driver
#define iicbus_reset(bus, speed, addr, oldaddr)
devclass_t ofw_iicbus_devclass
static device_method_t ofw_iicbus_methods[]
EARLY_DRIVER_MODULE(ofw_iicbus, iicbb, ofw_iicbus_driver, ofw_iicbus_devclass, 0, 0, BUS_PASS_BUS)
DEFINE_CLASS_1(iicbus, ofw_iicbus_driver, ofw_iicbus_methods, sizeof(struct iicbus_softc), iicbus_driver)
MODULE_VERSION(ofw_iicbus, 1)
MODULE_DEPEND(ofw_iicbus, iicbus, 1, 1, 1)
static device_probe_t ofw_iicbus_probe
static device_t ofw_iicbus_add_child(device_t dev, u_int order, const char *name, int unit)
static const struct ofw_bus_devinfo * ofw_iicbus_get_devinfo(device_t bus, device_t dev)
static device_attach_t ofw_iicbus_attach
static int ofw_iicbus_set_devinfo(device_t bus, device_t dev, phandle_t ofw_node, char *ofw_name, char *ofw_compat, uint32_t i2c_addr)
struct ofw_bus_devinfo opd_obdinfo
struct iicbus_ivar opd_dinfo