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 source clock divisor, set MSTR_CONFI...



details:   https://anonhg.NetBSD.org/src/rev/e016e6600bea
branches:  trunk
changeset: 808414:e016e6600bea
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Sat May 16 23:09:08 2015 +0000

description:
fix source clock divisor, set MSTR_CONFIG_LOAD after updating config, reset controller on errors, read from rx fifo before waiting for xfer to complete

diffstat:

 sys/arch/arm/nvidia/tegra_i2c.c |  21 ++++++++++++---------
 1 files changed, 12 insertions(+), 9 deletions(-)

diffs (75 lines):

diff -r 53e85494740f -r e016e6600bea sys/arch/arm/nvidia/tegra_i2c.c
--- a/sys/arch/arm/nvidia/tegra_i2c.c   Sat May 16 23:07:51 2015 +0000
+++ b/sys/arch/arm/nvidia/tegra_i2c.c   Sat May 16 23:09:08 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_i2c.c,v 1.2 2015/05/16 21:31:39 jmcneill Exp $ */
+/* $NetBSD: tegra_i2c.c,v 1.3 2015/05/16 23:09:08 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.2 2015/05/16 21:31:39 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_i2c.c,v 1.3 2015/05/16 23:09:08 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -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, 204000000);
+       tegra_car_periph_i2c_enable(loc->loc_port, 20400000);
 
        tegra_i2c_init(sc);
 
@@ -149,6 +149,8 @@
        I2C_WRITE(sc, I2C_CNFG_REG,
            I2C_CNFG_NEW_MASTER_FSM | I2C_CNFG_PACKET_MODE_EN);
        I2C_SET_CLEAR(sc, I2C_SL_CNFG_REG, I2C_SL_CNFG_NEWSL, 0);
+       I2C_WRITE(sc, I2C_BUS_CONFIG_LOAD_REG,
+           I2C_BUS_CONFIG_LOAD_MSTR_CONFIG_LOAD);
 }
 
 static int
@@ -239,6 +241,11 @@
        if ((flags & I2C_F_POLL) == 0) {
                I2C_WRITE(sc, I2C_INTERRUPT_MASK_REG, 0);
        }
+
+       if (error) {
+               tegra_i2c_init(sc);
+       }
+
        return error;
 }
 
@@ -349,7 +356,7 @@
        uint8_t *p = buf;
        size_t n, resid = buflen;
        uint32_t data;
-       int error, retry;
+       int retry;
 
        const uint32_t istatus = I2C_READ(sc, I2C_INTERRUPT_STATUS_REG);
        I2C_WRITE(sc, I2C_INTERRUPT_STATUS_REG, istatus);
@@ -372,10 +379,6 @@
            I2C_IOPACKET_XMITHDR_IE | I2C_IOPACKET_XMITHDR_READ |
            __SHIFTIN((addr << 1) | 1, I2C_IOPACKET_XMITHDR_SLAVE_ADDR));
 
-       if ((error = tegra_i2c_wait(sc, flags)) != 0) {
-               return error;
-       }
-
        while (resid > 0) {
                retry = 10000;
                while (--retry > 0) {
@@ -399,5 +402,5 @@
                p += min(resid, 4);
        }
 
-       return 0;
+       return tegra_i2c_wait(sc, flags);
 }



Home | Main Index | Thread Index | Old Index