Lines Matching +full:bus +full:- +full:addr

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
35 #include <sys/bus.h>
44 * system errno value later. This lets controller- and bus-layer code get
54 * Translate IIC_Exxxxx status values to vaguely-equivelent errno values.
75 * IIC_ERRNO marker bit. If lots of high-order bits are set, in iic2errno()
76 * then it's one of the negative pseudo-errors such as ERESTART in iic2errno()
77 * and we return it as-is. Otherwise it's a plain "small in iic2errno()
94 iicbus_intr(device_t bus, int event, char *buf) in iicbus_intr() argument
96 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus); in iicbus_intr()
99 if (sc->owner) in iicbus_intr()
100 IICBUS_INTR(sc->owner, event, buf); in iicbus_intr()
113 error = mtx_sleep(sc, &sc->lock, IICPRI|PCATCH, "iicreq", 0); in iicbus_poll()
117 error = mtx_sleep(sc, &sc->lock, IICPRI, "iicreq", 0); in iicbus_poll()
135 iicbus_request_bus(device_t bus, device_t dev, int how) in iicbus_request_bus() argument
138 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus); in iicbus_request_bus()
144 if (sc->owner == NULL) in iicbus_request_bus()
146 if ((how & IIC_RECURSIVE) && sc->owner == dev) in iicbus_request_bus()
153 ++sc->owncount; in iicbus_request_bus()
154 if (sc->owner == NULL) { in iicbus_request_bus()
155 sc->owner = dev; in iicbus_request_bus()
157 * Mark the device busy while it owns the bus, to in iicbus_request_bus()
158 * prevent detaching the device, bus, or hardware in iicbus_request_bus()
161 * attaching, it cannot be busied; mark the bus busy. in iicbus_request_bus()
164 sc->busydev = bus; in iicbus_request_bus()
166 sc->busydev = dev; in iicbus_request_bus()
167 device_busy(sc->busydev); in iicbus_request_bus()
169 * Drop the lock around the call to the bus driver, it in iicbus_request_bus()
177 reqdata.bus = bus; in iicbus_request_bus()
179 error = IICBUS_CALLBACK(device_get_parent(bus), in iicbus_request_bus()
184 sc->owner = NULL; in iicbus_request_bus()
185 sc->owncount = 0; in iicbus_request_bus()
187 device_unbusy(sc->busydev); in iicbus_request_bus()
203 iicbus_release_bus(device_t bus, device_t dev) in iicbus_release_bus() argument
206 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus); in iicbus_release_bus()
210 if (sc->owner != dev) { in iicbus_release_bus()
215 if (--sc->owncount == 0) { in iicbus_release_bus()
216 /* Drop the lock while informing the low-level driver. */ in iicbus_release_bus()
219 reqdata.bus = bus; in iicbus_release_bus()
221 IICBUS_CALLBACK(device_get_parent(bus), IIC_RELEASE_BUS, in iicbus_release_bus()
224 sc->owner = NULL; in iicbus_release_bus()
226 device_unbusy(sc->busydev); in iicbus_release_bus()
238 iicbus_started(device_t bus) in iicbus_started() argument
240 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus); in iicbus_started()
242 return (sc->started); in iicbus_started()
251 iicbus_start(device_t bus, u_char slave, int timeout) in iicbus_start() argument
253 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus); in iicbus_start()
256 if (sc->started) in iicbus_start()
257 return (IIC_ESTATUS); /* protocol error, bus already started */ in iicbus_start()
259 if (!(error = IICBUS_START(device_get_parent(bus), slave, timeout))) in iicbus_start()
260 sc->started = slave; in iicbus_start()
262 sc->started = 0; in iicbus_start()
273 iicbus_repeated_start(device_t bus, u_char slave, int timeout) in iicbus_repeated_start() argument
275 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus); in iicbus_repeated_start()
278 if (!sc->started) in iicbus_repeated_start()
279 return (IIC_ESTATUS); /* protocol error, bus not started */ in iicbus_repeated_start()
281 if (!(error = IICBUS_REPEATED_START(device_get_parent(bus), slave, timeout))) in iicbus_repeated_start()
282 sc->started = slave; in iicbus_repeated_start()
284 sc->started = 0; in iicbus_repeated_start()
292 * Send stop condition to the bus
295 iicbus_stop(device_t bus) in iicbus_stop() argument
297 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus); in iicbus_stop()
300 if (!sc->started) in iicbus_stop()
301 return (IIC_ESTATUS); /* protocol error, bus not started */ in iicbus_stop()
303 error = IICBUS_STOP(device_get_parent(bus)); in iicbus_stop()
306 sc->started = 0; in iicbus_stop()
318 iicbus_write(device_t bus, const char *buf, int len, int *sent, int timeout) in iicbus_write() argument
320 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus); in iicbus_write()
323 if (sc->started == 0 || (sc->strict != 0 && (sc->started & LSB) != 0)) in iicbus_write()
326 return (IICBUS_WRITE(device_get_parent(bus), buf, len, sent, timeout)); in iicbus_write()
336 iicbus_read(device_t bus, char *buf, int len, int *read, int last, int delay) in iicbus_read() argument
338 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus); in iicbus_read()
341 if (sc->started == 0 || (sc->strict != 0 && (sc->started & LSB) == 0)) in iicbus_read()
344 return (IICBUS_READ(device_get_parent(bus), buf, len, read, last, delay)); in iicbus_read()
353 iicbus_write_byte(device_t bus, char byte, int timeout) in iicbus_write_byte() argument
355 struct iicbus_softc *sc = device_get_softc(bus); in iicbus_write_byte()
360 if (sc->started == 0 || (sc->strict != 0 && (sc->started & LSB) != 0)) in iicbus_write_byte()
363 return (iicbus_write(bus, &data, 1, &sent, timeout)); in iicbus_write_byte()
372 iicbus_read_byte(device_t bus, char *byte, int timeout) in iicbus_read_byte() argument
374 struct iicbus_softc *sc = device_get_softc(bus); in iicbus_read_byte()
378 if (sc->started == 0 || (sc->strict != 0 && (sc->started & LSB) == 0)) in iicbus_read_byte()
381 return (iicbus_read(bus, byte, 1, &read, IIC_LAST_READ, timeout)); in iicbus_read_byte()
390 iicbus_block_write(device_t bus, u_char slave, char *buf, int len, int *sent) in iicbus_block_write() argument
392 u_char addr = slave & ~LSB; in iicbus_block_write() local
395 if ((error = iicbus_start(bus, addr, 0))) in iicbus_block_write()
398 error = iicbus_write(bus, buf, len, sent, 0); in iicbus_block_write()
400 iicbus_stop(bus); in iicbus_block_write()
411 iicbus_block_read(device_t bus, u_char slave, char *buf, int len, int *read) in iicbus_block_read() argument
413 u_char addr = slave | LSB; in iicbus_block_read() local
416 if ((error = iicbus_start(bus, addr, 0))) in iicbus_block_read()
419 error = iicbus_read(bus, buf, len, read, IIC_LAST_READ, 0); in iicbus_block_read()
421 iicbus_stop(bus); in iicbus_block_read()
439 iicbus_transfer(device_t bus, struct iic_msg *msgs, uint32_t nmsgs) in iicbus_transfer() argument
442 return (IICBUS_TRANSFER(device_get_parent(bus), msgs, nmsgs)); in iicbus_transfer()
449 device_t bus; in iicbus_transfer_excl() local
452 bus = device_get_parent(dev); in iicbus_transfer_excl()
453 error = iicbus_request_bus(bus, dev, how); in iicbus_transfer_excl()
455 error = IICBUS_TRANSFER(bus, msgs, nmsgs); in iicbus_transfer_excl()
456 iicbus_release_bus(bus, dev); in iicbus_transfer_excl()
468 int i, error, lenread, lenwrote, nkid, rpstart, addr; in iicbus_transfer_gen() local
469 device_t *children, bus; in iicbus_transfer_gen() local
478 bus = children[0]; in iicbus_transfer_gen()
483 addr = msgs[i].slave; in iicbus_transfer_gen()
485 addr |= LSB; in iicbus_transfer_gen()
487 addr &= ~LSB; in iicbus_transfer_gen()
491 error = iicbus_repeated_start(bus, addr, 0); in iicbus_transfer_gen()
493 error = iicbus_start(bus, addr, 0); in iicbus_transfer_gen()
500 error = iicbus_read(bus, msgs[i].buf, msgs[i].len, in iicbus_transfer_gen()
503 error = iicbus_write(bus, msgs[i].buf, msgs[i].len, in iicbus_transfer_gen()
510 iicbus_stop(bus); in iicbus_transfer_gen()
516 iicbus_stop(bus); in iicbus_transfer_gen()
528 * Two transfers back to back with a repeat-start between them; first we in iicdev_readfrom()
529 * write the address-within-device, then we read from the device. in iicdev_readfrom()