Lines Matching +full:i2c +full:- +full:slave +full:- +full:addr

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * mxl111sf-i2c.c - driver for the MaxLinear MXL111SF
5 * Copyright (C) 2010-2014 Michael Krufky <[email protected]>
8 #include "mxl111sf-i2c.h"
11 /* SW-I2C ----------------------------------------------------------------- */
79 ret = -EIO; in mxl111sf_i2c_bitbang_sendbyte()
210 /* SDA high to signal last byte read from slave */ in mxl111sf_i2c_nack()
223 /* ------------------------------------------------------------------------ */
232 if (msg->flags & I2C_M_RD) { in mxl111sf_i2c_sw_xfer_msg()
239 (msg->addr << 1) | 0x01); in mxl111sf_i2c_sw_xfer_msg()
245 for (i = 0; i < msg->len; i++) { in mxl111sf_i2c_sw_xfer_msg()
247 &msg->buf[i]); in mxl111sf_i2c_sw_xfer_msg()
253 if (i < msg->len - 1) in mxl111sf_i2c_sw_xfer_msg()
270 (msg->addr << 1) & 0xfe); in mxl111sf_i2c_sw_xfer_msg()
276 for (i = 0; i < msg->len; i++) { in mxl111sf_i2c_sw_xfer_msg()
278 msg->buf[i]); in mxl111sf_i2c_sw_xfer_msg()
292 /* HW-I2C ----------------------------------------------------------------- */
409 /* Check for I2C NACK status */ in mxl111sf_i2c_readagain()
440 mxl_i2c("addr: 0x%02x, read buff len: %d, write buff len: %d", in mxl111sf_i2c_hw_xfer_msg()
441 msg->addr, (msg->flags & I2C_M_RD) ? msg->len : 0, in mxl111sf_i2c_hw_xfer_msg()
442 (!(msg->flags & I2C_M_RD)) ? msg->len : 0); in mxl111sf_i2c_hw_xfer_msg()
447 /* command to indicate data payload is destined for I2C interface */ in mxl111sf_i2c_hw_xfer_msg()
451 /* enable I2C interface */ in mxl111sf_i2c_hw_xfer_msg()
456 /* enable I2C interface */ in mxl111sf_i2c_hw_xfer_msg()
461 /* set Timeout register on I2C interface */ in mxl111sf_i2c_hw_xfer_msg()
466 /* enable Interrupts on I2C interface */ in mxl111sf_i2c_hw_xfer_msg()
477 /* write data on I2C bus */ in mxl111sf_i2c_hw_xfer_msg()
478 if (!(msg->flags & I2C_M_RD) && (msg->len > 0)) { in mxl111sf_i2c_hw_xfer_msg()
479 mxl_i2c("%d\t%02x", msg->len, msg->buf[0]); in mxl111sf_i2c_hw_xfer_msg()
481 /* control register on I2C interface to initialize I2C bus */ in mxl111sf_i2c_hw_xfer_msg()
486 /* I2C Slave device Address */ in mxl111sf_i2c_hw_xfer_msg()
488 buf[6] = (msg->addr); in mxl111sf_i2c_hw_xfer_msg()
493 /* check for slave device status */ in mxl111sf_i2c_hw_xfer_msg()
495 mxl_i2c("NACK writing slave address %02x", in mxl111sf_i2c_hw_xfer_msg()
496 msg->addr); in mxl111sf_i2c_hw_xfer_msg()
497 /* if NACK, stop I2C bus and exit */ in mxl111sf_i2c_hw_xfer_msg()
501 ret = -EIO; in mxl111sf_i2c_hw_xfer_msg()
505 /* I2C interface can do I2C operations in block of 8 bytes of in mxl111sf_i2c_hw_xfer_msg()
506 I2C data. calculation to figure out number of blocks of i2c in mxl111sf_i2c_hw_xfer_msg()
508 block_len = (msg->len / 8); in mxl111sf_i2c_hw_xfer_msg()
509 left_over_len = (msg->len % 8); in mxl111sf_i2c_hw_xfer_msg()
516 /* write data on I2C interface */ in mxl111sf_i2c_hw_xfer_msg()
518 buf[3+(i*3)] = msg->buf[(index*8)+i]; in mxl111sf_i2c_hw_xfer_msg()
524 /* check for I2C NACK status */ in mxl111sf_i2c_hw_xfer_msg()
526 mxl_i2c("NACK writing slave address %02x", in mxl111sf_i2c_hw_xfer_msg()
527 msg->addr); in mxl111sf_i2c_hw_xfer_msg()
529 /* if NACK, stop I2C bus and exit */ in mxl111sf_i2c_hw_xfer_msg()
533 ret = -EIO; in mxl111sf_i2c_hw_xfer_msg()
548 buf[3+(i*3)] = msg->buf[(index*8)+i]; in mxl111sf_i2c_hw_xfer_msg()
550 index, i, msg->buf[(index*8)+i]); in mxl111sf_i2c_hw_xfer_msg()
555 /* check for I2C NACK status */ in mxl111sf_i2c_hw_xfer_msg()
557 mxl_i2c("NACK writing slave address %02x", in mxl111sf_i2c_hw_xfer_msg()
558 msg->addr); in mxl111sf_i2c_hw_xfer_msg()
560 /* if NACK, stop I2C bus and exit */ in mxl111sf_i2c_hw_xfer_msg()
564 ret = -EIO; in mxl111sf_i2c_hw_xfer_msg()
570 /* issue I2C STOP after write */ in mxl111sf_i2c_hw_xfer_msg()
577 /* read data from I2C bus */ in mxl111sf_i2c_hw_xfer_msg()
578 if ((msg->flags & I2C_M_RD) && (msg->len > 0)) { in mxl111sf_i2c_hw_xfer_msg()
579 mxl_i2c("read buf len %d", msg->len); in mxl111sf_i2c_hw_xfer_msg()
582 destined for I2C interface */ in mxl111sf_i2c_hw_xfer_msg()
587 /* I2C xfer length */ in mxl111sf_i2c_hw_xfer_msg()
589 buf[6] = (msg->len & 0xFF); in mxl111sf_i2c_hw_xfer_msg()
592 /* I2C slave device Address */ in mxl111sf_i2c_hw_xfer_msg()
594 buf[9] = msg->addr; in mxl111sf_i2c_hw_xfer_msg()
599 /* check for I2C NACK status */ in mxl111sf_i2c_hw_xfer_msg()
601 mxl_i2c("NACK reading slave address %02x", in mxl111sf_i2c_hw_xfer_msg()
602 msg->addr); in mxl111sf_i2c_hw_xfer_msg()
604 /* if NACK, stop I2C bus and exit */ in mxl111sf_i2c_hw_xfer_msg()
608 ret = -EIO; in mxl111sf_i2c_hw_xfer_msg()
612 /* I2C interface can do I2C operations in block of 8 bytes of in mxl111sf_i2c_hw_xfer_msg()
613 I2C data. calculation to figure out number of blocks of in mxl111sf_i2c_hw_xfer_msg()
614 i2c data required to program */ in mxl111sf_i2c_hw_xfer_msg()
615 block_len = ((msg->len) / 8); in mxl111sf_i2c_hw_xfer_msg()
616 left_over_len = ((msg->len) % 8); in mxl111sf_i2c_hw_xfer_msg()
622 /* command to read data from I2C interface */ in mxl111sf_i2c_hw_xfer_msg()
627 /* setup I2C read request packet on I2C interface */ in mxl111sf_i2c_hw_xfer_msg()
636 /* check for I2C NACK status */ in mxl111sf_i2c_hw_xfer_msg()
638 mxl_i2c("NACK reading slave address %02x", in mxl111sf_i2c_hw_xfer_msg()
639 msg->addr); in mxl111sf_i2c_hw_xfer_msg()
641 /* if NACK, stop I2C bus and exit */ in mxl111sf_i2c_hw_xfer_msg()
645 ret = -EIO; in mxl111sf_i2c_hw_xfer_msg()
649 /* copy data from i2c data payload to read buffer */ in mxl111sf_i2c_hw_xfer_msg()
655 mxl_i2c("i2c fifo empty! @ %d", in mxl111sf_i2c_hw_xfer_msg()
657 msg->buf[(index*8)+i] = in mxl111sf_i2c_hw_xfer_msg()
662 state, 8-(i+1), in mxl111sf_i2c_hw_xfer_msg()
666 k < 8-(i+1); in mxl111sf_i2c_hw_xfer_msg()
669 msg->buf[(index*8)+(k+i+1)] = in mxl111sf_i2c_hw_xfer_msg()
672 msg->buf[(index*8)+(k+i)], in mxl111sf_i2c_hw_xfer_msg()
675 msg->buf[(index*8)+(k+i+1)], in mxl111sf_i2c_hw_xfer_msg()
684 msg->buf[(index*8)+i] = in mxl111sf_i2c_hw_xfer_msg()
688 msg->buf[(index*8)+i] = in mxl111sf_i2c_hw_xfer_msg()
712 /* check for I2C NACK status */ in mxl111sf_i2c_hw_xfer_msg()
714 mxl_i2c("NACK reading slave address %02x", in mxl111sf_i2c_hw_xfer_msg()
715 msg->addr); in mxl111sf_i2c_hw_xfer_msg()
717 /* if NACK, stop I2C bus and exit */ in mxl111sf_i2c_hw_xfer_msg()
721 ret = -EIO; in mxl111sf_i2c_hw_xfer_msg()
726 msg->buf[(block_len*8)+i] = in mxl111sf_i2c_hw_xfer_msg()
734 /* indicate I2C interface to issue NACK in mxl111sf_i2c_hw_xfer_msg()
735 after next I2C read op */ in mxl111sf_i2c_hw_xfer_msg()
754 /* STOP and disable I2C MUX */ in mxl111sf_i2c_hw_xfer_msg()
758 /* de-initilize I2C BUS */ in mxl111sf_i2c_hw_xfer_msg()
767 /* disable I2C interface */ in mxl111sf_i2c_hw_xfer_msg()
772 /* de-initilize I2C BUS */ in mxl111sf_i2c_hw_xfer_msg()
776 /* disable I2C interface */ in mxl111sf_i2c_hw_xfer_msg()
781 /* disable I2C interface */ in mxl111sf_i2c_hw_xfer_msg()
786 /* disable I2C interface */ in mxl111sf_i2c_hw_xfer_msg()
797 /* ------------------------------------------------------------------------ */
803 struct mxl111sf_state *state = d->priv; in mxl111sf_i2c_xfer()
804 int hwi2c = (state->chip_rev > MXL111SF_V6); in mxl111sf_i2c_xfer()
807 if (mutex_lock_interruptible(&d->i2c_mutex) < 0) in mxl111sf_i2c_xfer()
808 return -EAGAIN; in mxl111sf_i2c_xfer()
815 mxl_debug_adv("failed with error %d on i2c transaction %d of %d, %sing %d bytes to/from 0x%02x", in mxl111sf_i2c_xfer()
819 msg[i].len, msg[i].addr); in mxl111sf_i2c_xfer()
825 mutex_unlock(&d->i2c_mutex); in mxl111sf_i2c_xfer()
827 return i == num ? num : -EREMOTEIO; in mxl111sf_i2c_xfer()