Home | History | Annotate | Line # | Download | only in ti
ti_iic.c revision 1.6
      1 /* $NetBSD: ti_iic.c,v 1.6 2020/06/03 16:00:00 jmcneill Exp $ */
      2 
      3 /*
      4  * Copyright (c) 2013 Manuel Bouyer.  All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  * 2. Redistributions in binary form must reproduce the above copyright
     12  *    notice, this list of conditions and the following disclaimer in the
     13  *    documentation and/or other materials provided with the distribution.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25  */
     26 
     27 /*-
     28  * Copyright (c) 2012 Jared D. McNeill <jmcneill (at) invisible.ca>
     29  * All rights reserved.
     30  *
     31  * Redistribution and use in source and binary forms, with or without
     32  * modification, are permitted provided that the following conditions
     33  * are met:
     34  * 1. Redistributions of source code must retain the above copyright
     35  *    notice, this list of conditions and the following disclaimer.
     36  * 2. The name of the author may not be used to endorse or promote products
     37  *    derived from this software without specific prior written permission.
     38  *
     39  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     40  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     41  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     42  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     43  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     44  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     45  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     46  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     47  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     48  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     49  * SUCH DAMAGE.
     50  */
     51 
     52 #include <sys/cdefs.h>
     53 __KERNEL_RCSID(0, "$NetBSD: ti_iic.c,v 1.6 2020/06/03 16:00:00 jmcneill Exp $");
     54 
     55 #include <sys/param.h>
     56 #include <sys/systm.h>
     57 #include <sys/device.h>
     58 #include <sys/conf.h>
     59 #include <sys/bus.h>
     60 #include <sys/proc.h>
     61 #include <sys/kernel.h>
     62 #include <sys/mutex.h>
     63 #include <sys/condvar.h>
     64 
     65 #include <dev/i2c/i2cvar.h>
     66 
     67 #include <dev/fdt/fdtvar.h>
     68 
     69 #include <arm/ti/ti_prcm.h>
     70 #include <arm/ti/ti_iicreg.h>
     71 
     72 #ifndef OMAP2_I2C_SLAVE_ADDR
     73 #define OMAP2_I2C_SLAVE_ADDR	0x01
     74 #endif
     75 
     76 #define OMAP2_I2C_FIFOBYTES(fd)	(8 << (fd))
     77 
     78 #ifdef I2CDEBUG
     79 #define DPRINTF(args)	printf args
     80 #else
     81 #define DPRINTF(args)
     82 #endif
     83 
     84 enum ti_iic_type {
     85 	TI_IIC_OMAP3,
     86 	TI_IIC_OMAP4,
     87 	TI_NTYPES
     88 };
     89 
     90 enum {
     91 	I2C_SYSC,
     92 	I2C_IRQSTATUS_RAW,
     93 	I2C_IRQSTATUS,
     94 	I2C_IRQENABLE,		/* OMAP3 */
     95 	I2C_IRQENABLE_SET,	/* OMAP4 */
     96 	I2C_IRQENABLE_CLR,	/* OMAP4 */
     97 	I2C_SYSS,
     98 	I2C_BUF,
     99 	I2C_CNT,
    100 	I2C_DATA,
    101 	I2C_CON,
    102 	I2C_OA,
    103 	I2C_SA,
    104 	I2C_PSC,
    105 	I2C_SCLL,
    106 	I2C_SCLH,
    107 	I2C_BUFSTAT,
    108 	TI_NREGS
    109 };
    110 
    111 static const u_int ti_iic_regmap[TI_NTYPES][TI_NREGS] = {
    112 	[TI_IIC_OMAP3] = {
    113 		[I2C_SYSC] = 0x20,
    114 		[I2C_IRQSTATUS_RAW] = 0x08,
    115 		[I2C_IRQSTATUS] = 0x08,
    116 		[I2C_IRQENABLE] = 0x04,
    117 		[I2C_SYSS] = 0x10,
    118 		[I2C_BUF] = 0x14,
    119 		[I2C_CNT] = 0x18,
    120 		[I2C_DATA] = 0x1c,
    121 		[I2C_CON] = 0x24,
    122 		[I2C_OA] = 0x28,
    123 		[I2C_SA] = 0x2c,
    124 		[I2C_PSC] = 0x30,
    125 		[I2C_SCLL] = 0x34,
    126 		[I2C_SCLH] = 0x38,
    127 		[I2C_BUFSTAT] = 0x40,
    128 	},
    129 	[TI_IIC_OMAP4] = {
    130 		[I2C_SYSC] = 0x10,
    131 		[I2C_IRQSTATUS_RAW] = 0x24,
    132 		[I2C_IRQSTATUS] = 0x28,
    133 		[I2C_IRQENABLE_SET] = 0x2c,
    134 		[I2C_IRQENABLE_CLR] = 0x30,
    135 		[I2C_SYSS] = 0x90,
    136 		[I2C_BUF] = 0x94,
    137 		[I2C_CNT] = 0x98,
    138 		[I2C_DATA] = 0x9c,
    139 		[I2C_CON] = 0xa4,
    140 		[I2C_OA] = 0xa8,
    141 		[I2C_SA] = 0xac,
    142 		[I2C_PSC] = 0xb0,
    143 		[I2C_SCLL] = 0xb4,
    144 		[I2C_SCLH] = 0xb8,
    145 		[I2C_BUFSTAT] = 0xc0,
    146 	},
    147 };
    148 
    149 static const struct of_compat_data compat_data[] = {
    150 	/* compatible		type */
    151 	{ "ti,omap3-i2c",	TI_IIC_OMAP3 },
    152 	{ "ti,omap4-i2c",	TI_IIC_OMAP4 },
    153 	{ NULL }
    154 };
    155 
    156 /* operation in progress */
    157 typedef enum {
    158 	TI_I2CREAD,
    159 	TI_I2CWRITE,
    160 	TI_I2CDONE,
    161 	TI_I2CERROR
    162 } ti_i2cop_t;
    163 
    164 struct ti_iic_softc {
    165 	device_t		sc_dev;
    166 	struct i2c_controller	sc_ic;
    167 	kmutex_t		sc_lock;
    168 	device_t		sc_i2cdev;
    169 
    170 	bus_space_tag_t		sc_iot;
    171 	bus_space_handle_t	sc_ioh;
    172 
    173 	enum ti_iic_type	sc_type;
    174 
    175 	void			*sc_ih;
    176 	kmutex_t		sc_mtx;
    177 	kcondvar_t		sc_cv;
    178 	ti_i2cop_t		sc_op;
    179 	int			sc_opflags;
    180 	int			sc_buflen;
    181 	int			sc_bufidx;
    182 	char			*sc_buf;
    183 
    184 	bool			sc_busy;
    185 
    186 	int			sc_rxthres;
    187 	int			sc_txthres;
    188 };
    189 
    190 #define I2C_READ_REG(sc, reg)		\
    191 	bus_space_read_2((sc)->sc_iot, (sc)->sc_ioh, ti_iic_regmap[(sc)->sc_type][(reg)])
    192 #define I2C_READ_DATA(sc)		\
    193 	bus_space_read_1((sc)->sc_iot, (sc)->sc_ioh, ti_iic_regmap[(sc)->sc_type][I2C_DATA])
    194 #define I2C_WRITE_REG(sc, reg, val)	\
    195 	bus_space_write_2((sc)->sc_iot, (sc)->sc_ioh, ti_iic_regmap[(sc)->sc_type][(reg)], (val))
    196 #define I2C_WRITE_DATA(sc, val)		\
    197 	bus_space_write_1((sc)->sc_iot, (sc)->sc_ioh, ti_iic_regmap[(sc)->sc_type][I2C_DATA], (val))
    198 
    199 static int	ti_iic_match(device_t, cfdata_t, void *);
    200 static void	ti_iic_attach(device_t, device_t, void *);
    201 
    202 static int	ti_iic_intr(void *);
    203 
    204 static int	ti_iic_acquire_bus(void *, int);
    205 static void	ti_iic_release_bus(void *, int);
    206 static int	ti_iic_exec(void *, i2c_op_t, i2c_addr_t, const void *,
    207 			       size_t, void *, size_t, int);
    208 
    209 static int	ti_iic_reset(struct ti_iic_softc *);
    210 static int	ti_iic_op(struct ti_iic_softc *, i2c_addr_t, ti_i2cop_t,
    211 			       uint8_t *, size_t, int);
    212 static void	ti_iic_handle_intr(struct ti_iic_softc *, uint32_t);
    213 static void	ti_iic_do_read(struct ti_iic_softc *, uint32_t);
    214 static void	ti_iic_do_write(struct ti_iic_softc *, uint32_t);
    215 
    216 static int	ti_iic_wait(struct ti_iic_softc *, uint16_t, uint16_t, int);
    217 static uint32_t	ti_iic_stat(struct ti_iic_softc *, uint32_t);
    218 static int	ti_iic_flush(struct ti_iic_softc *);
    219 
    220 static i2c_tag_t ti_iic_get_tag(device_t);
    221 
    222 static const struct fdtbus_i2c_controller_func ti_iic_funcs = {
    223 	.get_tag = ti_iic_get_tag,
    224 };
    225 
    226 CFATTACH_DECL_NEW(ti_iic, sizeof(struct ti_iic_softc),
    227     ti_iic_match, ti_iic_attach, NULL, NULL);
    228 
    229 static int
    230 ti_iic_match(device_t parent, cfdata_t match, void *opaque)
    231 {
    232 	struct fdt_attach_args * const faa = opaque;
    233 
    234 	return of_match_compat_data(faa->faa_phandle, compat_data);
    235 }
    236 
    237 static void
    238 ti_iic_attach(device_t parent, device_t self, void *opaque)
    239 {
    240 	struct ti_iic_softc *sc = device_private(self);
    241 	struct fdt_attach_args * const faa = opaque;
    242 	const int phandle = faa->faa_phandle;
    243 	int fifodepth, fifo;
    244 	const char *modname;
    245 	char intrstr[128];
    246 	bus_addr_t addr;
    247 	bus_size_t size;
    248 
    249 	if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) {
    250 		aprint_error(": couldn't get registers\n");
    251 		return;
    252 	}
    253 	if (!fdtbus_intr_str(phandle, 0, intrstr, sizeof(intrstr))) {
    254 		aprint_error(": couldn't decode interrupt\n");
    255 		return;
    256 	}
    257 
    258 	if (ti_prcm_enable_hwmod(phandle, 0) != 0) {
    259 		aprint_error(": couldn't enable module\n");
    260 		return;
    261 	}
    262 
    263 	sc->sc_dev = self;
    264 	sc->sc_iot = faa->faa_bst;
    265 	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE);
    266 	mutex_init(&sc->sc_mtx, MUTEX_DEFAULT, IPL_NET);
    267 	cv_init(&sc->sc_cv, "tiiic");
    268 	sc->sc_ic.ic_cookie = sc;
    269 	sc->sc_ic.ic_acquire_bus = ti_iic_acquire_bus;
    270 	sc->sc_ic.ic_release_bus = ti_iic_release_bus;
    271 	sc->sc_ic.ic_exec = ti_iic_exec;
    272 
    273 	if (bus_space_map(sc->sc_iot, addr, size, 0, &sc->sc_ioh) != 0) {
    274 		aprint_error(": couldn't map registers\n");
    275 		return;
    276 	}
    277 	sc->sc_type = of_search_compatible(phandle, compat_data)->data;
    278 
    279 	sc->sc_ih = fdtbus_intr_establish(phandle, 0, IPL_NET, 0,
    280 	    ti_iic_intr, sc);
    281 	if (sc->sc_ih == NULL) {
    282 		aprint_error(": couldn't establish interrupt\n");
    283 		return;
    284 	}
    285 
    286 	modname = fdtbus_get_string(phandle, "ti,hwmods");
    287 	if (modname == NULL)
    288 		modname = fdtbus_get_string(OF_parent(phandle), "ti,hwmods");
    289 
    290 	fifodepth = I2C_BUFSTAT_FIFODEPTH(I2C_READ_REG(sc, I2C_BUFSTAT));
    291 	fifo = OMAP2_I2C_FIFOBYTES(fifodepth);
    292 	sc->sc_rxthres = sc->sc_txthres = fifo >> 1;
    293 
    294 	aprint_naive("\n");
    295 	if (modname != NULL)
    296 		aprint_normal(": I2C controller (%s), %d-bytes FIFO\n", modname, fifo);
    297 	else
    298 		aprint_normal(": I2C controller (i2c@%" PRIxBUSADDR "), %d-bytes FIFO\n",
    299 		    addr, fifo);
    300 
    301 	ti_iic_reset(sc);
    302 	ti_iic_flush(sc);
    303 
    304 	fdtbus_register_i2c_controller(self, phandle, &ti_iic_funcs);
    305 
    306 	fdtbus_attach_i2cbus(self, phandle, &sc->sc_ic, iicbus_print);
    307 }
    308 
    309 static int
    310 ti_iic_intr(void *arg)
    311 {
    312 	struct ti_iic_softc *sc = arg;
    313 	uint32_t stat;
    314 
    315 	mutex_enter(&sc->sc_mtx);
    316 	DPRINTF(("ti_iic_intr opflags=%#x\n", sc->sc_opflags));
    317 	if ((sc->sc_opflags & I2C_F_POLL) == 0) {
    318 		stat = I2C_READ_REG(sc, I2C_IRQSTATUS);
    319 		DPRINTF(("ti_iic_intr pre handle sc->sc_op eq %#x\n", sc->sc_op));
    320 		ti_iic_handle_intr(sc, stat);
    321 		I2C_WRITE_REG(sc, I2C_IRQSTATUS, stat);
    322 		if (sc->sc_op == TI_I2CERROR || sc->sc_op == TI_I2CDONE) {
    323 			DPRINTF(("ti_iic_intr post handle sc->sc_op %#x\n", sc->sc_op));
    324 			cv_broadcast(&sc->sc_cv);
    325 		}
    326 	}
    327 	mutex_exit(&sc->sc_mtx);
    328 	DPRINTF(("ti_iic_intr status 0x%x\n", stat));
    329 	return 1;
    330 }
    331 
    332 static int
    333 ti_iic_acquire_bus(void *opaque, int flags)
    334 {
    335 	struct ti_iic_softc *sc = opaque;
    336 
    337 	mutex_enter(&sc->sc_lock);
    338 	while (sc->sc_busy)
    339 		cv_wait(&sc->sc_cv, &sc->sc_lock);
    340 	sc->sc_busy = true;
    341 	mutex_exit(&sc->sc_lock);
    342 
    343 	return 0;
    344 }
    345 
    346 static void
    347 ti_iic_release_bus(void *opaque, int flags)
    348 {
    349 	struct ti_iic_softc *sc = opaque;
    350 
    351 	mutex_enter(&sc->sc_lock);
    352 	sc->sc_busy = false;
    353 	cv_broadcast(&sc->sc_cv);
    354 	mutex_exit(&sc->sc_lock);
    355 }
    356 
    357 static int
    358 ti_iic_exec(void *opaque, i2c_op_t op, i2c_addr_t addr,
    359     const void *cmdbuf, size_t cmdlen, void *buf, size_t len, int flags)
    360 {
    361 	struct ti_iic_softc *sc = opaque;
    362 	int err;
    363 
    364 	DPRINTF(("ti_iic_exec: op 0x%x cmdlen %zd len %zd flags 0x%x\n",
    365 	    op, cmdlen, len, flags));
    366 
    367 	if (cmdlen > 0) {
    368 		err = ti_iic_op(sc, addr, TI_I2CWRITE,
    369 		    __UNCONST(cmdbuf), cmdlen,
    370 		    (I2C_OP_READ_P(op) ? 0 : I2C_F_STOP) | flags);
    371 		if (err)
    372 			goto done;
    373 	}
    374 
    375 	if (I2C_OP_STOP_P(op))
    376 		flags |= I2C_F_STOP;
    377 
    378 	/*
    379 	 * I2C controller doesn't allow for zero-byte transfers.
    380 	 */
    381 	if (len == 0) {
    382 		err = EINVAL;
    383 		goto done;
    384 	}
    385 
    386 	if (I2C_OP_READ_P(op)) {
    387 		err = ti_iic_op(sc, addr, TI_I2CREAD, buf, len, flags);
    388 	} else {
    389 		err = ti_iic_op(sc, addr, TI_I2CWRITE, buf, len, flags);
    390 	}
    391 
    392 done:
    393 	if (err)
    394 		ti_iic_reset(sc);
    395 
    396 	ti_iic_flush(sc);
    397 
    398 	DPRINTF(("ti_iic_exec: done %d\n", err));
    399 	return err;
    400 }
    401 
    402 static int
    403 ti_iic_reset(struct ti_iic_softc *sc)
    404 {
    405 	uint32_t psc, scll, sclh;
    406 	int i;
    407 
    408 	DPRINTF(("ti_iic_reset\n"));
    409 
    410 	/* Disable */
    411 	I2C_WRITE_REG(sc, I2C_CON, 0);
    412 	/* Soft reset */
    413 	I2C_WRITE_REG(sc, I2C_SYSC, I2C_SYSC_SRST);
    414 	delay(1000);
    415 	/* enable so that we can check for reset complete */
    416 	I2C_WRITE_REG(sc, I2C_CON, I2C_CON_EN);
    417 	delay(1000);
    418 	for (i = 0; i < 1000; i++) { /* 1s delay for reset */
    419 		if (I2C_READ_REG(sc, I2C_SYSS) & I2C_SYSS_RDONE)
    420 			break;
    421 	}
    422 	/* Disable again */
    423 	I2C_WRITE_REG(sc, I2C_CON, 0);
    424 	delay(50000);
    425 
    426 	if (i >= 1000) {
    427 		aprint_error_dev(sc->sc_dev, ": couldn't reset module\n");
    428 		return 1;
    429 	}
    430 
    431 
    432 	/* XXX standard speed only */
    433 	if (sc->sc_type == TI_IIC_OMAP3) {
    434 		psc = (96000000 / 19200000) - 1;
    435 		scll = sclh = (19200000 / (2 * 100000)) - 6;
    436 	} else {
    437 		psc = 3;
    438 		scll = 53;
    439 		sclh = 55;
    440 	}
    441 
    442 	/* Clocks */
    443 	I2C_WRITE_REG(sc, I2C_PSC, psc);
    444 	I2C_WRITE_REG(sc, I2C_SCLL, scll);
    445 	I2C_WRITE_REG(sc, I2C_SCLH, sclh);
    446 
    447 	/* Own I2C address */
    448 	I2C_WRITE_REG(sc, I2C_OA, OMAP2_I2C_SLAVE_ADDR);
    449 
    450 	/* 5 bytes fifo */
    451 	I2C_WRITE_REG(sc, I2C_BUF,
    452 	    I2C_BUF_RXTRSH(sc->sc_rxthres) | I2C_BUF_TXTRSH(sc->sc_txthres));
    453 
    454 	/* Enable */
    455 	I2C_WRITE_REG(sc, I2C_CON, I2C_CON_EN);
    456 
    457 	return 0;
    458 }
    459 
    460 static int
    461 ti_iic_op(struct ti_iic_softc *sc, i2c_addr_t addr, ti_i2cop_t op,
    462     uint8_t *buf, size_t buflen, int flags)
    463 {
    464 	uint16_t con, stat, mask;
    465 	int err, retry;
    466 
    467 	KASSERT(op == TI_I2CREAD || op == TI_I2CWRITE);
    468 	DPRINTF(("ti_iic_op: addr %#x op %#x buf %p buflen %#x flags %#x\n",
    469 	    addr, op, buf, (unsigned int) buflen, flags));
    470 
    471 	mask = I2C_IRQSTATUS_ARDY | I2C_IRQSTATUS_NACK | I2C_IRQSTATUS_AL;
    472 	if (op == TI_I2CREAD) {
    473 		mask |= I2C_IRQSTATUS_RDR | I2C_IRQSTATUS_RRDY;
    474 	} else {
    475 		mask |= I2C_IRQSTATUS_XDR | I2C_IRQSTATUS_XRDY;
    476 	}
    477 
    478 	err = ti_iic_wait(sc, I2C_IRQSTATUS_BB, 0, flags);
    479 	if (err) {
    480 		DPRINTF(("ti_iic_op: wait error %d\n", err));
    481 		return err;
    482 	}
    483 
    484 	con = I2C_CON_EN;
    485 	con |= I2C_CON_MST;
    486 	con |= I2C_CON_STT;
    487 	if (flags & I2C_F_STOP)
    488 		con |= I2C_CON_STP;
    489 	if (addr & ~0x7f)
    490 		con |= I2C_CON_XSA;
    491 	if (op == TI_I2CWRITE)
    492 		con |= I2C_CON_TRX;
    493 
    494 	mutex_enter(&sc->sc_mtx);
    495 	sc->sc_op = op;
    496 	sc->sc_opflags = flags;
    497 	sc->sc_buf = buf;
    498 	sc->sc_buflen = buflen;
    499 	sc->sc_bufidx = 0;
    500 
    501 	I2C_WRITE_REG(sc, I2C_CON, I2C_CON_EN | I2C_CON_MST | I2C_CON_STP);
    502 	DPRINTF(("ti_iic_op: op %d con 0x%x ", op, con));
    503 	I2C_WRITE_REG(sc, I2C_CNT, buflen);
    504 	I2C_WRITE_REG(sc, I2C_SA, (addr & I2C_SA_MASK));
    505 	DPRINTF(("SA 0x%x len %d\n", I2C_READ_REG(sc, I2C_SA), I2C_READ_REG(sc, I2C_CNT)));
    506 
    507 	if ((flags & I2C_F_POLL) == 0 || sc->sc_type == TI_IIC_OMAP3) {
    508 		/* clear any pending interrupt */
    509 		I2C_WRITE_REG(sc, I2C_IRQSTATUS,
    510 		    I2C_READ_REG(sc, I2C_IRQSTATUS));
    511 		/* and enable */
    512 		if (sc->sc_type == TI_IIC_OMAP4) {
    513 			I2C_WRITE_REG(sc, I2C_IRQENABLE_SET, mask);
    514 		} else {
    515 			I2C_WRITE_REG(sc, I2C_IRQENABLE, mask);
    516 		}
    517 	}
    518 	/* start transfer */
    519 	I2C_WRITE_REG(sc, I2C_CON, con);
    520 
    521 	if ((flags & I2C_F_POLL) == 0) {
    522 		/* and wait for completion */
    523 		DPRINTF(("ti_iic_op waiting, op %#x\n", sc->sc_op));
    524 		while (sc->sc_op == op) {
    525 			if (cv_timedwait(&sc->sc_cv, &sc->sc_mtx,
    526 			    mstohz(5000)) == EWOULDBLOCK) {
    527 				/* timeout */
    528 				op = TI_I2CERROR;
    529 			}
    530 		}
    531 		DPRINTF(("ti_iic_op waiting done, op %#x\n", sc->sc_op));
    532 
    533 		/* disable interrupts */
    534 		if (sc->sc_type == TI_IIC_OMAP4) {
    535 			I2C_WRITE_REG(sc, I2C_IRQENABLE_CLR, 0xffff);
    536 		} else {
    537 			I2C_WRITE_REG(sc, I2C_IRQENABLE, 0);
    538 		}
    539 	} else {
    540 		/* poll for completion */
    541 		DPRINTF(("ti_iic_op polling, op %x\n", sc->sc_op));
    542 		while (sc->sc_op == op) {
    543 			stat = ti_iic_stat(sc, mask);
    544 			DPRINTF(("ti_iic_op stat 0x%x\n", stat));
    545 			if (stat == 0) {
    546 				/* timeout */
    547 				sc->sc_op = TI_I2CERROR;
    548 			} else {
    549 				ti_iic_handle_intr(sc, stat);
    550 			}
    551 			I2C_WRITE_REG(sc, I2C_IRQSTATUS, stat);
    552 		}
    553 		DPRINTF(("ti_iic_op polling done, op now %x\n", sc->sc_op));
    554 	}
    555 	mutex_exit(&sc->sc_mtx);
    556 	retry = 10000;
    557 	I2C_WRITE_REG(sc, I2C_CON, 0);
    558 	while (I2C_READ_REG(sc, I2C_CON) & I2C_CON_MST) {
    559 		delay(100);
    560 		if (--retry == 0)
    561 			break;
    562 	}
    563 	return (sc->sc_op == TI_I2CDONE) ? 0 : EIO;
    564 }
    565 
    566 static void
    567 ti_iic_handle_intr(struct ti_iic_softc *sc, uint32_t stat)
    568 {
    569 	KASSERT(mutex_owned(&sc->sc_mtx));
    570 	KASSERT(stat != 0);
    571 	DPRINTF(("ti_iic_handle_intr stat %#x\n", stat));
    572 
    573 	if (stat &
    574 	    (I2C_IRQSTATUS_NACK|I2C_IRQSTATUS_AL)) {
    575 		sc->sc_op = TI_I2CERROR;
    576 		return;
    577 	}
    578 	if (stat & I2C_IRQSTATUS_ARDY) {
    579 		sc->sc_op = TI_I2CDONE;
    580 		return;
    581 	}
    582 	if (sc->sc_op == TI_I2CREAD)
    583 		ti_iic_do_read(sc, stat);
    584 	else if (sc->sc_op == TI_I2CWRITE)
    585 		ti_iic_do_write(sc, stat);
    586 	else
    587 		return;
    588 }
    589 void
    590 ti_iic_do_read(struct ti_iic_softc *sc, uint32_t stat)
    591 {
    592 	int len = 0;
    593 
    594 	KASSERT(mutex_owned(&sc->sc_mtx));
    595 	DPRINTF(("ti_iic_do_read stat %#x\n", stat));
    596 	if (stat & I2C_IRQSTATUS_RDR) {
    597 		len = I2C_READ_REG(sc, I2C_BUFSTAT);
    598 		len = I2C_BUFSTAT_RXSTAT(len);
    599 		DPRINTF(("ti_iic_do_read receive drain len %d left %d\n",
    600 		    len, I2C_READ_REG(sc, I2C_CNT)));
    601 	} else if (stat & I2C_IRQSTATUS_RRDY) {
    602 		len = sc->sc_rxthres + 1;
    603 		DPRINTF(("ti_iic_do_read receive len %d left %d\n",
    604 		    len, I2C_READ_REG(sc, I2C_CNT)));
    605 	}
    606 	for (;
    607 	    sc->sc_bufidx < sc->sc_buflen && len > 0;
    608 	    sc->sc_bufidx++, len--) {
    609 		sc->sc_buf[sc->sc_bufidx] = I2C_READ_DATA(sc);
    610 		DPRINTF(("ti_iic_do_read got b[%d]=0x%x\n", sc->sc_bufidx,
    611 		    sc->sc_buf[sc->sc_bufidx]));
    612 	}
    613 	DPRINTF(("ti_iic_do_read done\n"));
    614 }
    615 
    616 void
    617 ti_iic_do_write(struct ti_iic_softc *sc, uint32_t stat)
    618 {
    619 	int len = 0;
    620 
    621 	DPRINTF(("ti_iic_do_write stat %#x\n", stat));
    622 	KASSERT(mutex_owned(&sc->sc_mtx));
    623 	if (stat & I2C_IRQSTATUS_XDR) {
    624 		len = I2C_READ_REG(sc, I2C_BUFSTAT);
    625 		len = I2C_BUFSTAT_TXSTAT(len);
    626 		DPRINTF(("ti_iic_do_write xmit drain len %d left %d\n",
    627 		    len, I2C_READ_REG(sc, I2C_CNT)));
    628 	} else if (stat & I2C_IRQSTATUS_XRDY) {
    629 		len = sc->sc_txthres + 1;
    630 		DPRINTF(("ti_iic_do_write xmit len %d left %d\n",
    631 		    len, I2C_READ_REG(sc, I2C_CNT)));
    632 	}
    633 	for (;
    634 	    sc->sc_bufidx < sc->sc_buflen && len > 0;
    635 	    sc->sc_bufidx++, len--) {
    636 		DPRINTF(("ti_iic_do_write send b[%d]=0x%x\n",
    637 		    sc->sc_bufidx, sc->sc_buf[sc->sc_bufidx]));
    638 		I2C_WRITE_DATA(sc, sc->sc_buf[sc->sc_bufidx]);
    639 	}
    640 	DPRINTF(("ti_iic_do_write done\n"));
    641 }
    642 
    643 static int
    644 ti_iic_wait(struct ti_iic_softc *sc, uint16_t mask, uint16_t val, int flags)
    645 {
    646 	int retry = 10;
    647 	uint16_t v;
    648 	DPRINTF(("ti_iic_wait mask %#x val %#x flags %#x\n", mask, val, flags));
    649 
    650 	while (((v = I2C_READ_REG(sc, I2C_IRQSTATUS_RAW)) & mask) != val) {
    651 		--retry;
    652 		if (retry == 0) {
    653 			aprint_error_dev(sc->sc_dev, ": wait timeout, "
    654 			    "mask = %#x val = %#x stat = %#x\n",
    655 			    mask, val, v);
    656 			return EBUSY;
    657 		}
    658 		if (flags & I2C_F_POLL) {
    659 			delay(50000);
    660 		} else {
    661 			kpause("tiiic", false, mstohz(50), NULL);
    662 		}
    663 	}
    664 	DPRINTF(("ti_iic_wait done retry %#x\n", retry));
    665 
    666 	return 0;
    667 }
    668 
    669 static uint32_t
    670 ti_iic_stat(struct ti_iic_softc *sc, uint32_t mask)
    671 {
    672 	uint32_t v;
    673 	int retry = 500;
    674 	DPRINTF(("ti_iic_wait mask %#x\n", mask));
    675 	while (--retry > 0) {
    676 		v = I2C_READ_REG(sc, I2C_IRQSTATUS_RAW) & mask;
    677 		if (v != 0)
    678 			break;
    679 		delay(100);
    680 	}
    681 	DPRINTF(("ti_iic_wait done retry %#x\n", retry));
    682 	return v;
    683 }
    684 
    685 static int
    686 ti_iic_flush(struct ti_iic_softc *sc)
    687 {
    688 	DPRINTF(("ti_iic_flush\n"));
    689 #if 0
    690 	int retry = 1000;
    691 	uint16_t v;
    692 
    693 	while ((v = I2C_READ_REG(sc, I2C_IRQSTATUS_RAW)) & I2C_IRQSTATUS_RRDY) {
    694 		if (--retry == 0) {
    695 			aprint_error_dev(sc->sc_dev,
    696 			    ": flush timeout, stat = %#x\n", v);
    697 			return EBUSY;
    698 		}
    699 		(void)I2C_READ_DATA(sc);
    700 		delay(1000);
    701 	}
    702 #endif
    703 
    704 	I2C_WRITE_REG(sc, I2C_CNT, 0);
    705 	return 0;
    706 }
    707 
    708 static i2c_tag_t
    709 ti_iic_get_tag(device_t dev)
    710 {
    711 	struct ti_iic_softc * const sc = device_private(dev);
    712 
    713 	return &sc->sc_ic;
    714 }
    715