Lines Matching +full:slave +full:- +full:mode

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
136 uint8_t mode;
143 {"rockchip,rk3288-i2c", 1},
144 {"rockchip,rk3328-i2c", 1},
145 {"rockchip,rk3399-i2c", 1},
152 { -1, 0 }
159 #define RK_I2C_LOCK(sc) mtx_lock(&(sc)->mtx)
160 #define RK_I2C_UNLOCK(sc) mtx_unlock(&(sc)->mtx)
161 #define RK_I2C_ASSERT_LOCKED(sc) mtx_assert(&(sc)->mtx, MA_OWNED)
162 #define RK_I2C_READ(sc, reg) bus_read_4((sc)->res[0], (reg))
163 #define RK_I2C_WRITE(sc, reg, val) bus_write_4((sc)->res[0], (reg), (val))
172 err = clk_get_freq(sc->sclk, &sclk_freq);
176 clkdiv = (sclk_freq / speed / RK_I2C_CLKDIV_MUL / 2) - 1;
193 busfreq = IICBUS_GET_FREQUENCY(sc->iicbus, speed);
217 len = sc->msg->len - sc->cnt;
218 if (sc->tx_slave_addr) {
219 KASSERT(sc->cnt == 0, ("tx_slave_addr in the middle of data"));
230 for (j = 0; j < MIN(len - i, 4); j++) {
232 if (sc->tx_slave_addr) {
233 buf = sc->msg->slave;
234 sc->tx_slave_addr = false;
236 KASSERT(sc->cnt < sc->msg->len,
238 buf = sc->msg->buf[sc->cnt];
239 sc->cnt++;
261 if (sc->msg == NULL) {
262 device_printf(sc->dev, "No current iic msg\n");
266 len = sc->msg->len - sc->cnt;
275 sc->msg->buf[sc->cnt++] = buf8;
284 if (!(sc->msg->flags & IIC_M_NOSTOP)) {
287 sc->state = STATE_STOP;
297 sc->state = STATE_IDLE;
298 sc->transfer_done = 1;
312 sc->ipd = RK_I2C_READ(sc, RK_I2C_IPD);
315 if ((sc->ipd & RK_I2C_IPD_ALL) == 0)
318 RK_I2C_WRITE(sc, RK_I2C_IPD, sc->ipd);
319 sc->ipd &= RK_I2C_IPD_ALL;
321 if (sc->ipd & RK_I2C_IPD_NAKRCVIPD) {
323 sc->ipd &= ~RK_I2C_IPD_NAKRCVIPD;
324 sc->nak_recv = true;
326 sc->transfer_done = true;
327 sc->state = STATE_IDLE;
331 switch (sc->state) {
338 if (sc->mode == RK_I2C_CON_MODE_RRX ||
339 sc->mode == RK_I2C_CON_MODE_RX) {
340 sc->state = STATE_READ;
344 if ((sc->msg->len - sc->cnt) > 32)
347 transfer_len = sc->msg->len - sc->cnt;
355 sc->state = STATE_WRITE;
366 if (sc->cnt == sc->msg->len) {
369 sc->mode = RK_I2C_CON_MODE_RX;
372 reg |= sc->mode << RK_I2C_CON_MODE_SHIFT;
375 if ((sc->msg->len - sc->cnt) > 32)
378 transfer_len = sc->msg->len - sc->cnt;
387 if (sc->cnt < sc->msg->len) {
403 sc->transfer_done = 1;
404 sc->state = STATE_IDLE;
432 sc->transfer_done = false;
433 sc->nak_recv = false;
434 sc->tx_slave_addr = false;
435 sc->cnt = 0;
436 sc->state = STATE_IDLE;
437 sc->msg = msg;
440 if (!(sc->msg->flags & IIC_M_NOSTART)) {
442 if (sc->mode == RK_I2C_CON_MODE_TX) {
443 sc->tx_slave_addr = true;
445 sc->state = STATE_START;
451 if (sc->mode == RK_I2C_CON_MODE_RX) {
452 sc->state = STATE_READ;
456 RK_I2C_WRITE(sc, RK_I2C_MRXCNT, sc->msg->len);
460 sc->state = STATE_WRITE;
470 reg |= sc->mode << RK_I2C_CON_MODE_SHIFT;
487 while (sc->busy)
488 mtx_sleep(sc, &sc->mtx, 0, "i2cbuswait", 0);
489 sc->busy = 1;
510 if (i < nmsgs - 1) {
514 (msgs[i].slave != msgs[i + 1].slave))) {
523 * messages should have same slave address.
526 if (nmsgs - i >= 2 && msgs[i].len < 4 &&
529 (msgs[i].slave & ~LSB) == (msgs[i + 1].slave & ~LSB)) {
530 sc->mode = RK_I2C_CON_MODE_RRX;
532 /* Write slave address */
533 reg = msgs[i].slave & ~LSB;
537 /* Write slave register address */
549 sc->mode = RK_I2C_CON_MODE_RX;
551 sc->mode = RK_I2C_CON_MODE_RRX;
552 reg = msgs[i].slave & ~LSB;
558 sc->mode = RK_I2C_CON_MODE_TX;
562 last_msg = (i >= nmsgs - 1) ||
567 for(timeout = 10000; timeout > 0; timeout--) {
569 if (sc->transfer_done)
576 while (err == 0 && !sc->transfer_done) {
577 err = msleep(sc, &sc->mtx, PZERO, "rk_i2c",
587 sc->busy = 0;
589 if (sc->nak_recv)
602 if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
616 sc->dev = dev;
618 mtx_init(&sc->mtx, device_get_nameunit(dev), "rk_i2c", MTX_DEF);
620 if (bus_alloc_resources(dev, rk_i2c_spec, sc->res) != 0) {
626 if (bus_setup_intr(dev, sc->res[1],
628 &sc->intrhand)) {
629 bus_release_resources(dev, rk_i2c_spec, sc->res);
637 error = clk_get_by_ofw_name(dev, 0, "i2c", &sc->sclk);
642 error = clk_enable(sc->sclk);
648 error = clk_get_by_ofw_name(dev, 0, "pclk", &sc->pclk);
653 if (sc->pclk != NULL) {
654 error = clk_enable(sc->pclk);
661 sc->iicbus = device_add_child(dev, "iicbus", DEVICE_UNIT_ANY);
662 if (sc->iicbus == NULL) {
689 if (sc->sclk != NULL)
690 clk_release(sc->sclk);
691 if (sc->pclk != NULL)
692 clk_release(sc->pclk);
694 if (sc->intrhand != NULL)
695 bus_teardown_intr(sc->dev, sc->res[1], sc->intrhand);
697 bus_release_resources(dev, rk_i2c_spec, sc->res);
699 mtx_destroy(&sc->mtx);