Lines Matching +full:i2c +full:- +full:bus +full:- +full:name
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
31 * Autoconfiguration and support routines for the Philips serial I2C bus
37 #include <sys/bus.h>
51 /* See comments below for why auto-scanning is a bad idea. */
54 SYSCTL_NODE(_hw, OID_AUTO, i2c, CTLFLAG_RW, 0, "i2c controls");
60 device_set_desc(dev, "Philips I2C bus"); in iicbus_probe()
102 sc->dev = dev; in iicbus_attach_common()
103 mtx_init(&sc->lock, "iicbus", NULL, MTX_DEF); in iicbus_attach_common()
108 sc->strict = strict; in iicbus_attach_common()
110 sc->strict = 1; in iicbus_attach_common()
112 /* device probing is meaningless since the bus is supposed to be in iicbus_attach_common()
113 * hot-plug. Moreover, some I2C chips do not appreciate random in iicbus_attach_common()
150 mtx_destroy(&sc->lock); in iicbus_detach()
161 if (devi->addr != 0) in iicbus_print_child()
162 retval += printf(" at addr %#x", devi->addr); in iicbus_print_child()
163 resource_list_print_type(&devi->rl, "irq", SYS_RES_IRQ, "%jd"); in iicbus_print_child()
170 iicbus_probe_nomatch(device_t bus, device_t child) in iicbus_probe_nomatch() argument
174 device_printf(bus, "<unknown card> at addr %#x\n", devi->addr); in iicbus_probe_nomatch()
178 iicbus_child_location(device_t bus, device_t child, struct sbuf *sb) in iicbus_child_location() argument
182 sbuf_printf(sb, "addr=%#x", devi->addr); in iicbus_child_location()
187 iicbus_child_pnpinfo(device_t bus, device_t child, struct sbuf *sb) in iicbus_child_pnpinfo() argument
193 iicbus_read_ivar(device_t bus, device_t child, int which, uintptr_t *result) in iicbus_read_ivar() argument
201 *result = devi->addr; in iicbus_read_ivar()
208 iicbus_write_ivar(device_t bus, device_t child, int which, uintptr_t value) in iicbus_write_ivar() argument
216 if (devi->addr != 0) in iicbus_write_ivar()
218 devi->addr = value; in iicbus_write_ivar()
224 iicbus_add_child_common(device_t dev, u_int order, const char *name, int unit, in iicbus_add_child_common() argument
230 child = device_add_child_ordered(dev, order, name, unit); in iicbus_add_child_common()
238 resource_list_init(&devi->rl); in iicbus_add_child_common()
244 iicbus_add_child(device_t dev, u_int order, const char *name, int unit) in iicbus_add_child() argument
248 dev, order, name, unit, sizeof(struct iicbus_ivar))); in iicbus_add_child()
259 resource_list_free(&devi->rl); in iicbus_child_deleted()
264 iicbus_hinted_child(device_t bus, const char *dname, int dunit) in iicbus_hinted_child() argument
270 child = BUS_ADD_CHILD(bus, 0, dname, dunit); in iicbus_hinted_child()
272 resource_int_value(dname, dunit, "addr", &devi->addr); in iicbus_hinted_child()
275 device_printf(bus, in iicbus_hinted_child()
281 iicbus_get_resource_list(device_t bus __unused, device_t child) in iicbus_get_resource_list()
286 return (&devi->rl); in iicbus_get_resource_list()
316 * If a bus frequency value was passed in, use it. Otherwise initialize in iicbus_init_frequency()
317 * it first to the standard i2c 100KHz frequency, then override that in iicbus_init_frequency()
321 sc->bus_freq = bus_freq; in iicbus_init_frequency()
323 sc->bus_freq = 100000; in iicbus_init_frequency()
325 "frequency", (int *)&sc->bus_freq); in iicbus_init_frequency()
328 * Set up the sysctl that allows the bus frequency to be changed. in iicbus_init_frequency()
336 OID_AUTO, "frequency", CTLFLAG_RWTUN, &sc->bus_freq, in iicbus_init_frequency()
337 sc->bus_freq, "Bus frequency in Hz"); in iicbus_init_frequency()
346 * If the frequency has not been configured for the bus, or the request in iicbus_get_frequency()
348 * use the configured bus speed. in iicbus_get_frequency()
350 if (sc->bus_freq == 0 || speed == IIC_SLOW) in iicbus_get_frequency()
352 return (sc->bus_freq); in iicbus_get_frequency()
363 /* bus interface */