38#include <sys/kernel.h>
41#include <sys/malloc.h>
42#include <sys/module.h>
46#include <sys/sysctl.h>
56SYSCTL_NODE(_hw, OID_AUTO, i2c, CTLFLAG_RW, 0,
"i2c controls");
62 device_set_desc(
dev,
"Philips I2C bus");
65 return (BUS_PROBE_GENERIC);
70iic_probe_device(device_t
dev, u_char
addr)
75 if ((
addr & 1) == 0) {
105 mtx_init(&sc->
lock,
"iicbus", NULL, MTX_DEF);
108 if (resource_int_value(device_get_name(
dev),
109 device_get_unit(
dev),
"strict", &
strict) == 0)
120 printf(
"Probing for devices on iicbus%d:", device_get_unit(
dev));
124 if (iic_probe_device(
dev, (u_char)
addr)) {
125 printf(
" <%x>",
addr);
130 bus_generic_probe(
dev);
131 bus_enumerate_hinted_children(
dev);
132 bus_generic_attach(
dev);
149 if ((err = device_delete_children(
dev)) != 0)
152 mtx_destroy(&sc->
lock);
162 retval += bus_print_child_header(
dev, child);
164 retval += printf(
" at addr %#x", devi->
addr);
165 resource_list_print_type(&devi->
rl,
"irq", SYS_RES_IRQ,
"%jd");
166 retval += bus_print_child_footer(
dev, child);
176 device_printf(bus,
"<unknown card> at addr %#x\n", devi->
addr);
184 sbuf_printf(sb,
"addr=%#x", devi->
addr);
203 *result = devi->
addr;
232 child = device_add_child_ordered(
dev, order, name, unit);
235 devi = malloc(ivars_size, M_DEVBUF, M_NOWAIT | M_ZERO);
237 device_delete_child(
dev, child);
240 resource_list_init(&devi->
rl);
241 device_set_ivars(child, devi);
260 child = BUS_ADD_CHILD(bus, 0, dname, dunit);
262 resource_int_value(dname, dunit,
"addr", &devi->
addr);
263 if (resource_int_value(dname, dunit,
"irq", &irq) == 0) {
264 if (bus_set_resource(child, SYS_RES_IRQ, 0, irq, 1) != 0)
266 "warning: bus_set_resource() failed\n");
270static struct resource_list *
314 resource_int_value(device_get_name(
dev), device_get_unit(
dev),
324 SYSCTL_ADD_UINT(device_get_sysctl_ctx(
dev),
325 SYSCTL_CHILDREN(device_get_sysctl_tree(
dev)),
326 OID_AUTO,
"frequency", CTLFLAG_RW | CTLFLAG_TUN, &sc->
bus_freq,
327 sc->
bus_freq,
"Bus frequency in Hz");
350 DEVMETHOD(device_suspend, bus_generic_suspend),
351 DEVMETHOD(device_resume, bus_generic_resume),
354 DEVMETHOD(bus_setup_intr, bus_generic_setup_intr),
355 DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
356 DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
357 DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
358 DEVMETHOD(bus_adjust_resource, bus_generic_adjust_resource),
359 DEVMETHOD(bus_alloc_resource, bus_generic_rl_alloc_resource),
360 DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource),
361 DEVMETHOD(bus_release_resource, bus_generic_rl_release_resource),
362 DEVMETHOD(bus_set_resource, bus_generic_rl_set_resource),
int iicbus_write_ivar(device_t bus, device_t child, int which, uintptr_t value)
int iicbus_attach_common(device_t dev, u_int bus_freq)
int iicbus_null_repeated_start(device_t dev, u_char addr)
static void iicbus_hinted_child(device_t bus, const char *dname, int dunit)
static int iicbus_probe(device_t dev)
int iicbus_read_ivar(device_t bus, device_t child, int which, uintptr_t *result)
MODULE_VERSION(iicbus, IICBUS_MODVER)
static struct resource_list * iicbus_get_resource_list(device_t bus __unused, device_t child)
SYSCTL_NODE(_hw, OID_AUTO, i2c, CTLFLAG_RW, 0, "i2c controls")
devclass_t iicbus_devclass
void iicbus_init_frequency(device_t dev, u_int bus_freq)
void iicbus_probe_nomatch(device_t bus, device_t child)
static device_t iicbus_add_child(device_t dev, u_int order, const char *name, int unit)
static int iicbus_print_child(device_t dev, device_t child)
int iicbus_child_pnpinfo(device_t bus, device_t child, struct sbuf *sb)
static u_int iicbus_get_frequency(device_t dev, u_char speed)
static device_method_t iicbus_methods[]
int iicbus_null_callback(device_t dev, int index, caddr_t data)
int iicbus_child_location(device_t bus, device_t child, struct sbuf *sb)
int iicbus_generic_intr(device_t dev, int event, char *buf)
DRIVER_MODULE(iicbus, iichb, iicbus_driver, iicbus_devclass, 0, 0)
static int iicbus_attach(device_t dev)
device_t iicbus_add_child_common(device_t dev, u_int order, const char *name, int unit, size_t ivars_size)
int iicbus_detach(device_t dev)
int iicbus_block_read(device_t bus, u_char slave, char *buf, int len, int *read)
int iicbus_transfer(device_t bus, struct iic_msg *msgs, uint32_t nmsgs)
int iicbus_stop(device_t bus)
int iicbus_start(device_t bus, u_char slave, int timeout)
#define iicbus_reset(bus, speed, addr, oldaddr)