Author: nwhitehorn
Date: Mon Nov  8 19:53:16 2010
New Revision: 214999
URL: http://svn.freebsd.org/changeset/base/214999

Log:
  Provide support for IIC_M_NOSTOP/IIC_M_NOSTART for bit-banging and
  otherwise low-level controllers.
  
  Reviewed by:  thompsa

Modified:
  head/sys/dev/iicbus/iiconf.c

Modified: head/sys/dev/iicbus/iiconf.c
==============================================================================
--- head/sys/dev/iicbus/iiconf.c        Mon Nov  8 19:52:14 2010        
(r214998)
+++ head/sys/dev/iicbus/iiconf.c        Mon Nov  8 19:53:16 2010        
(r214999)
@@ -363,7 +363,7 @@ iicbus_transfer(device_t bus, struct iic
 int
 iicbus_transfer_gen(device_t dev, struct iic_msg *msgs, uint32_t nmsgs)
 {
-       int i, error, lenread, lenwrote, nkid;
+       int i, error, lenread, lenwrote, nkid, rpstart, addr;
        device_t *children, bus;
 
        if ((error = device_get_children(dev, &children, &nkid)) != 0)
@@ -373,14 +373,38 @@ iicbus_transfer_gen(device_t dev, struct
                return (EIO);
        }
        bus = children[0];
+       rpstart = 0;
        free(children, M_TEMP);
        for (i = 0, error = 0; i < nmsgs && error == 0; i++) {
+               addr = msgs[i].slave;
                if (msgs[i].flags & IIC_M_RD)
-                       error = iicbus_block_read(bus, msgs[i].slave,
-                           msgs[i].buf, msgs[i].len, &lenread);
+                       addr |= LSB;
                else
-                       error = iicbus_block_write(bus, msgs[i].slave,
-                           msgs[i].buf, msgs[i].len, &lenwrote);
+                       addr &= ~LSB;
+
+               if (!(msgs[i].flags & IIC_M_NOSTART)) {
+                       if (rpstart)
+                               error = iicbus_repeated_start(bus, addr, 0);
+                       else
+                               error = iicbus_start(bus, addr, 0);
+               }
+
+               if (error)
+                       break;
+
+               if (msgs[i].flags & IIC_M_RD)
+                       error = iicbus_read(bus, msgs[i].buf, msgs[i].len,
+                           &lenread, IIC_LAST_READ, 0);
+               else
+                       error = iicbus_write(bus, msgs[i].buf, msgs[i].len,
+                           &lenwrote, 0);
+
+               if (!(msgs[i].flags & IIC_M_NOSTOP)) {
+                       rpstart = 0;
+                       iicbus_stop(bus);
+               } else {
+                       rpstart = 1;    /* Next message gets repeated start */
+               }
        }
        return (error);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to