Deleted Added
full compact
iiconf.c (289095) iiconf.c (289097)
1/*-
2 * Copyright (c) 1998 Nicolas Souchu
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1998 Nicolas Souchu
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/sys/dev/iicbus/iiconf.c 289095 2015-10-09 23:20:08Z ian $");
28__FBSDID("$FreeBSD: head/sys/dev/iicbus/iiconf.c 289097 2015-10-09 23:58:19Z ian $");
29
30#include <sys/param.h>
31#include <sys/systm.h>
32#include <sys/lock.h>
33#include <sys/malloc.h>
34#include <sys/module.h>
35#include <sys/mutex.h>
36#include <sys/bus.h>

--- 165 unchanged lines hidden (view full) ---

202 */
203int
204iicbus_start(device_t bus, u_char slave, int timeout)
205{
206 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus);
207 int error = 0;
208
209 if (sc->started)
29
30#include <sys/param.h>
31#include <sys/systm.h>
32#include <sys/lock.h>
33#include <sys/malloc.h>
34#include <sys/module.h>
35#include <sys/mutex.h>
36#include <sys/bus.h>

--- 165 unchanged lines hidden (view full) ---

202 */
203int
204iicbus_start(device_t bus, u_char slave, int timeout)
205{
206 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus);
207 int error = 0;
208
209 if (sc->started)
210 return (EINVAL); /* bus already started */
210 return (IIC_ESTATUS); /* protocol error, bus already started */
211
212 if (!(error = IICBUS_START(device_get_parent(bus), slave, timeout)))
213 sc->started = slave;
214 else
215 sc->started = 0;
216
217 return (error);
218}

--- 5 unchanged lines hidden (view full) ---

224 */
225int
226iicbus_repeated_start(device_t bus, u_char slave, int timeout)
227{
228 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus);
229 int error = 0;
230
231 if (!sc->started)
211
212 if (!(error = IICBUS_START(device_get_parent(bus), slave, timeout)))
213 sc->started = slave;
214 else
215 sc->started = 0;
216
217 return (error);
218}

--- 5 unchanged lines hidden (view full) ---

224 */
225int
226iicbus_repeated_start(device_t bus, u_char slave, int timeout)
227{
228 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus);
229 int error = 0;
230
231 if (!sc->started)
232 return (EINVAL); /* bus should have been already started */
232 return (IIC_ESTATUS); /* protocol error, bus not started */
233
234 if (!(error = IICBUS_REPEATED_START(device_get_parent(bus), slave, timeout)))
235 sc->started = slave;
236 else
237 sc->started = 0;
238
239 return (error);
240}

--- 5 unchanged lines hidden (view full) ---

246 */
247int
248iicbus_stop(device_t bus)
249{
250 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus);
251 int error = 0;
252
253 if (!sc->started)
233
234 if (!(error = IICBUS_REPEATED_START(device_get_parent(bus), slave, timeout)))
235 sc->started = slave;
236 else
237 sc->started = 0;
238
239 return (error);
240}

--- 5 unchanged lines hidden (view full) ---

246 */
247int
248iicbus_stop(device_t bus)
249{
250 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus);
251 int error = 0;
252
253 if (!sc->started)
254 return (EINVAL); /* bus not started */
254 return (IIC_ESTATUS); /* protocol error, bus not started */
255
256 error = IICBUS_STOP(device_get_parent(bus));
257
258 /* refuse any further access */
259 sc->started = 0;
260
261 return (error);
262}

--- 6 unchanged lines hidden (view full) ---

269 */
270int
271iicbus_write(device_t bus, const char *buf, int len, int *sent, int timeout)
272{
273 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus);
274
275 /* a slave must have been started for writing */
276 if (sc->started == 0 || (sc->strict != 0 && (sc->started & LSB) != 0))
255
256 error = IICBUS_STOP(device_get_parent(bus));
257
258 /* refuse any further access */
259 sc->started = 0;
260
261 return (error);
262}

--- 6 unchanged lines hidden (view full) ---

269 */
270int
271iicbus_write(device_t bus, const char *buf, int len, int *sent, int timeout)
272{
273 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus);
274
275 /* a slave must have been started for writing */
276 if (sc->started == 0 || (sc->strict != 0 && (sc->started & LSB) != 0))
277 return (EINVAL);
277 return (IIC_ESTATUS);
278
279 return (IICBUS_WRITE(device_get_parent(bus), buf, len, sent, timeout));
280}
281
282/*
283 * iicbus_read()
284 *
285 * Read a block of data from the slave previously started by
286 * iicbus_read() call
287 */
288int
289iicbus_read(device_t bus, char *buf, int len, int *read, int last, int delay)
290{
291 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus);
292
293 /* a slave must have been started for reading */
294 if (sc->started == 0 || (sc->strict != 0 && (sc->started & LSB) == 0))
278
279 return (IICBUS_WRITE(device_get_parent(bus), buf, len, sent, timeout));
280}
281
282/*
283 * iicbus_read()
284 *
285 * Read a block of data from the slave previously started by
286 * iicbus_read() call
287 */
288int
289iicbus_read(device_t bus, char *buf, int len, int *read, int last, int delay)
290{
291 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus);
292
293 /* a slave must have been started for reading */
294 if (sc->started == 0 || (sc->strict != 0 && (sc->started & LSB) == 0))
295 return (EINVAL);
295 return (IIC_ESTATUS);
296
297 return (IICBUS_READ(device_get_parent(bus), buf, len, read, last, delay));
298}
299
300/*
301 * iicbus_write_byte()
302 *
303 * Write a byte to the slave previously started by iicbus_start() call
304 */
305int
306iicbus_write_byte(device_t bus, char byte, int timeout)
307{
296
297 return (IICBUS_READ(device_get_parent(bus), buf, len, read, last, delay));
298}
299
300/*
301 * iicbus_write_byte()
302 *
303 * Write a byte to the slave previously started by iicbus_start() call
304 */
305int
306iicbus_write_byte(device_t bus, char byte, int timeout)
307{
308 struct iicbus_softc *sc = device_get_softc(bus);
308 char data = byte;
309 int sent;
310
309 char data = byte;
310 int sent;
311
312 /* a slave must have been started for writing */
313 if (sc->started == 0 || (sc->strict != 0 && (sc->started & LSB) != 0))
314 return (IIC_ESTATUS);
315
311 return (iicbus_write(bus, &data, 1, &sent, timeout));
312}
313
314/*
315 * iicbus_read_byte()
316 *
317 * Read a byte from the slave previously started by iicbus_start() call
318 */
319int
320iicbus_read_byte(device_t bus, char *byte, int timeout)
321{
316 return (iicbus_write(bus, &data, 1, &sent, timeout));
317}
318
319/*
320 * iicbus_read_byte()
321 *
322 * Read a byte from the slave previously started by iicbus_start() call
323 */
324int
325iicbus_read_byte(device_t bus, char *byte, int timeout)
326{
327 struct iicbus_softc *sc = device_get_softc(bus);
322 int read;
323
328 int read;
329
330 /* a slave must have been started for reading */
331 if (sc->started == 0 || (sc->strict != 0 && (sc->started & LSB) == 0))
332 return (IIC_ESTATUS);
333
324 return (iicbus_read(bus, byte, 1, &read, IIC_LAST_READ, timeout));
325}
326
327/*
328 * iicbus_block_write()
329 *
330 * Write a block of data to slave ; start/stop protocol managed
331 */

--- 44 unchanged lines hidden (view full) ---

376 * transfers at a low level.
377 *
378 * Pointers passed in as part of iic_msg must be kernel pointers.
379 * Callers that have user addresses to manage must do so on their own.
380 */
381int
382iicbus_transfer(device_t bus, struct iic_msg *msgs, uint32_t nmsgs)
383{
334 return (iicbus_read(bus, byte, 1, &read, IIC_LAST_READ, timeout));
335}
336
337/*
338 * iicbus_block_write()
339 *
340 * Write a block of data to slave ; start/stop protocol managed
341 */

--- 44 unchanged lines hidden (view full) ---

386 * transfers at a low level.
387 *
388 * Pointers passed in as part of iic_msg must be kernel pointers.
389 * Callers that have user addresses to manage must do so on their own.
390 */
391int
392iicbus_transfer(device_t bus, struct iic_msg *msgs, uint32_t nmsgs)
393{
394
384 return (IICBUS_TRANSFER(device_get_parent(bus), msgs, nmsgs));
385}
386
387/*
388 * Generic version of iicbus_transfer that calls the appropriate
389 * routines to accomplish this. See note above about acceptable
390 * buffer addresses.
391 */
392int
393iicbus_transfer_gen(device_t dev, struct iic_msg *msgs, uint32_t nmsgs)
394{
395 int i, error, lenread, lenwrote, nkid, rpstart, addr;
396 device_t *children, bus;
397 bool nostop;
398
399 if ((error = device_get_children(dev, &children, &nkid)) != 0)
395 return (IICBUS_TRANSFER(device_get_parent(bus), msgs, nmsgs));
396}
397
398/*
399 * Generic version of iicbus_transfer that calls the appropriate
400 * routines to accomplish this. See note above about acceptable
401 * buffer addresses.
402 */
403int
404iicbus_transfer_gen(device_t dev, struct iic_msg *msgs, uint32_t nmsgs)
405{
406 int i, error, lenread, lenwrote, nkid, rpstart, addr;
407 device_t *children, bus;
408 bool nostop;
409
410 if ((error = device_get_children(dev, &children, &nkid)) != 0)
400 return (error);
411 return (IIC_ERESOURCE);
401 if (nkid != 1) {
402 free(children, M_TEMP);
412 if (nkid != 1) {
413 free(children, M_TEMP);
403 return (EIO);
414 return (IIC_ENOTSUPP);
404 }
405 bus = children[0];
406 rpstart = 0;
407 free(children, M_TEMP);
408 nostop = iicbus_get_nostop(dev);
409 for (i = 0, error = 0; i < nmsgs && error == 0; i++) {
410 addr = msgs[i].slave;
411 if (msgs[i].flags & IIC_M_RD)

--- 34 unchanged lines hidden ---
415 }
416 bus = children[0];
417 rpstart = 0;
418 free(children, M_TEMP);
419 nostop = iicbus_get_nostop(dev);
420 for (i = 0, error = 0; i < nmsgs && error == 0; i++) {
421 addr = msgs[i].slave;
422 if (msgs[i].flags & IIC_M_RD)

--- 34 unchanged lines hidden ---