Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm/nvidia fix i2c periph clock, send repeat start ...



details:   https://anonhg.NetBSD.org/src/rev/fd1f33061c51
branches:  trunk
changeset: 811693:fd1f33061c51
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Wed Nov 11 11:32:01 2015 +0000

description:
fix i2c periph clock, send repeat start for write-then-read xfers

diffstat:

 sys/arch/arm/nvidia/tegra_i2c.c |  15 ++++++++-------
 1 files changed, 8 insertions(+), 7 deletions(-)

diffs (71 lines):

diff -r 682dcc8daa2f -r fd1f33061c51 sys/arch/arm/nvidia/tegra_i2c.c
--- a/sys/arch/arm/nvidia/tegra_i2c.c   Wed Nov 11 08:51:33 2015 +0000
+++ b/sys/arch/arm/nvidia/tegra_i2c.c   Wed Nov 11 11:32:01 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_i2c.c,v 1.5 2015/05/31 14:41:59 jmcneill Exp $ */
+/* $NetBSD: tegra_i2c.c,v 1.6 2015/11/11 11:32:01 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -29,7 +29,7 @@
 #include "locators.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_i2c.c,v 1.5 2015/05/31 14:41:59 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_i2c.c,v 1.6 2015/11/11 11:32:01 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -70,7 +70,7 @@
 
 static int     tegra_i2c_wait(struct tegra_i2c_softc *, int);
 static int     tegra_i2c_write(struct tegra_i2c_softc *, i2c_addr_t,
-                               const uint8_t *, size_t, int);
+                               const uint8_t *, size_t, int, bool);
 static int     tegra_i2c_read(struct tegra_i2c_softc *, i2c_addr_t, uint8_t *,
                               size_t, int);
 
@@ -125,7 +125,7 @@
        aprint_normal_dev(self, "interrupting on irq %d\n", loc->loc_intr);
 
        /* Recommended setting for standard mode */
-       tegra_car_periph_i2c_enable(loc->loc_port, 20400000);
+       tegra_car_periph_i2c_enable(loc->loc_port, 204000000);
 
        tegra_i2c_init(sc);
 
@@ -239,7 +239,7 @@
        }
 
        if (cmdlen > 0) {
-               error = tegra_i2c_write(sc, addr, cmdbuf, cmdlen, flags);
+               error = tegra_i2c_write(sc, addr, cmdbuf, cmdlen, flags, true);
                if (error) {
                        goto done;
                }
@@ -248,7 +248,7 @@
        if (I2C_OP_READ_P(op)) {
                error = tegra_i2c_read(sc, addr, buf, buflen, flags);
        } else {
-               error = tegra_i2c_write(sc, addr, buf, buflen, flags);
+               error = tegra_i2c_write(sc, addr, buf, buflen, flags, false);
        }
 
 done:
@@ -308,7 +308,7 @@
 
 static int
 tegra_i2c_write(struct tegra_i2c_softc *sc, i2c_addr_t addr, const uint8_t *buf,
-    size_t buflen, int flags)
+    size_t buflen, int flags, bool repeat_start)
 {
        const uint8_t *p = buf;
        size_t n, resid = buflen;
@@ -334,6 +334,7 @@
        /* I2C Master Transmit Packet Header */
        I2C_WRITE(sc, I2C_TX_PACKET_FIFO_REG,
            I2C_IOPACKET_XMITHDR_IE |
+           (repeat_start ? I2C_IOPACKET_XMITHDR_REPEAT_STARTSTOP : 0) |
            __SHIFTIN((addr << 1), I2C_IOPACKET_XMITHDR_SLAVE_ADDR));
 
        /* Transmit data */



Home | Main Index | Thread Index | Old Index