31#include "opt_platform.h"
35#include <sys/kernel.h>
36#include <sys/module.h>
37#include <sys/sysctl.h>
40#include <dev/ofw/ofw_bus.h>
41#include <dev/ofw/ofw_bus_subr.h>
42#include <dev/ofw/openfirm.h>
90 device_printf(
dev,
"idle the bus for %s on bus %s\n",
91 device_get_nameunit(
rd->
dev),
92 device_get_nameunit(
rd->
bus));
100 device_printf(
dev,
"select bus idx %d for %s on bus %s\n", i,
101 device_get_nameunit(
rd->
dev), device_get_nameunit(
rd->
bus));
119 if ((err = IICMUX_BUS_SELECT(
dev, i,
rd)) != 0)
135iicmux_get_node(device_t
dev, device_t child)
140 for (i = 0; i <= sc->
maxbus; ++i) {
142 return (sc->childnodes[i]);
227 "iicmux_add_child: bus idx %d too big",
busidx);
231 device_printf(
dev,
"iicmux_add_child: bus idx %d already added",
248 phandle_t child, node, parent;
255 if((node = ofw_bus_get_node(sc->
dev)) == 0) {
256 device_printf(sc->
dev,
"cannot find FDT node\n");
265 if ((parent = ofw_bus_find_child(node,
"i2c-mux")) == 0)
271 for (child = OF_child(parent); child != 0; child = OF_peer(child)) {
272 if (OF_getencprop(child,
"reg", &idx,
sizeof(idx)) == -1) {
273 device_printf(sc->
dev,
274 "child bus missing required 'reg' property\n");
278 device_printf(sc->
dev,
279 "child bus 'reg' property %d exceeds the number "
280 "of buses supported by the device (%d)\n",
284 sc->
childdevs[idx] = device_add_child(sc->
dev,
"iicbus", -1);
285 sc->childnodes[idx] = child;
286 if (sc->
maxbus < (
int)idx)
299 for (i = 0; i < sc->
numbuses; ++i) {
300 sc->
childdevs[i] = device_add_child(sc->
dev,
"iicbus", -1);
314 device_printf(
dev,
"iicmux_attach: numbuses %d > max %d\n",
327 SYSCTL_ADD_UINT(device_get_sysctl_ctx(sc->
dev),
328 SYSCTL_CHILDREN(device_get_sysctl_tree(sc->
dev)), OID_AUTO,
329 "debugmux", CTLFLAG_RWTUN, &sc->
debugmux, 0,
"debug mux operations");
341 for (i = 0; i <= sc->
maxbus; ++i) {
344 if ((err = device_delete_child(
dev, sc->
childdevs[i])) != 0)
367 DEVMETHOD(ofw_bus_get_node, iicmux_get_node),
static u_int iicbus_get_frequency(device_t dev, u_char speed)
int iicmux_detach(device_t dev)
static u_int iicmux_get_frequency(device_t dev, u_char speed)
static device_method_t iicmux_methods[]
static int iicmux_attach_children(struct iicmux_softc *sc)
DEFINE_CLASS_0(iicmux, iicmux_driver, iicmux_methods, sizeof(struct iicmux_softc))
static int iicmux_callback(device_t dev, int index, caddr_t data)
static int iicmux_modevent(module_t mod, int type, void *unused)
DECLARE_MODULE(iicmux, iicmux_mod, SI_SUB_DRIVERS, SI_ORDER_ANY)
static int iicmux_write(device_t dev, const char *buf, int len, int *bytes, int timeout)
int iicmux_attach(device_t dev, device_t busdev, int numbuses)
static int iicmux_transfer(device_t dev, struct iic_msg *msgs, uint32_t nmsgs)
MODULE_VERSION(iicmux, 1)
static int iicmux_repeated_start(device_t dev, u_char slave, int timeout)
static int iicmux_start(device_t dev, u_char slave, int timeout)
static int iicmux_reset(device_t dev, u_char speed, u_char addr, u_char *oldaddr)
static int iicmux_stop(device_t dev)
static int iicmux_intr(device_t dev, int event, char *buf)
MODULE_DEPEND(iicmux, iicbus, 1, 1, 1)
int iicmux_add_child(device_t dev, device_t child, int busidx)
static int iicmux_read(device_t dev, char *buf, int len, int *bytes, int last, int delay)
static moduledata_t iicmux_mod
#define IICMUX_SELECT_IDLE
struct iic_reqbus_data * rd
int iicbus_request_bus(device_t bus, device_t dev, int how)
void iicbus_intr(device_t bus, int event, char *buf)
int iicbus_transfer(device_t bus, struct iic_msg *msgs, uint32_t nmsgs)
int iicbus_read(device_t bus, char *buf, int len, int *read, int last, int delay)
int iic2errno(int iic_status)
int iicbus_release_bus(device_t bus, device_t dev)
int iicbus_write(device_t bus, const char *buf, int len, int *sent, int timeout)
int iicbus_stop(device_t bus)
int iicbus_repeated_start(device_t bus, u_char slave, int timeout)
int iicbus_start(device_t bus, u_char slave, int timeout)
#define iicbus_reset(bus, speed, addr, oldaddr)
device_t childdevs[IICMUX_MAX_BUSES]