Lines Matching refs:msgs

443 static int octeon_i2c_hlc_read(struct octeon_i2c *i2c, struct i2c_msg *msgs)
453 cmd |= (u64)(msgs[0].len - 1) << SW_TWSI_SIZE_SHIFT;
455 cmd |= (u64)(msgs[0].addr & 0x7full) << SW_TWSI_ADDR_SHIFT;
466 for (i = 0, j = msgs[0].len - 1; i < msgs[0].len && i < 4; i++, j--)
467 msgs[0].buf[j] = (cmd >> (8 * i)) & 0xff;
469 if (msgs[0].len > 4) {
471 for (i = 0; i < msgs[0].len - 4 && i < 4; i++, j--)
472 msgs[0].buf[j] = (cmd >> (8 * i)) & 0xff;
480 static int octeon_i2c_hlc_write(struct octeon_i2c *i2c, struct i2c_msg *msgs)
490 cmd |= (u64)(msgs[0].len - 1) << SW_TWSI_SIZE_SHIFT;
492 cmd |= (u64)(msgs[0].addr & 0x7full) << SW_TWSI_ADDR_SHIFT;
494 for (i = 0, j = msgs[0].len - 1; i < msgs[0].len && i < 4; i++, j--)
495 cmd |= (u64)msgs[0].buf[j] << (8 * i);
497 if (msgs[0].len > 4) {
500 for (i = 0; i < msgs[0].len - 4 && i < 4; i++, j--)
501 ext |= (u64)msgs[0].buf[j] << (8 * i);
558 static int octeon_i2c_hlc_comp_read(struct octeon_i2c *i2c, struct i2c_msg *msgs)
567 cmd |= (u64)(msgs[1].len - 1) << SW_TWSI_SIZE_SHIFT;
569 cmd |= (u64)(msgs[0].addr & 0x7full) << SW_TWSI_ADDR_SHIFT;
572 ret = octeon_i2c_hlc_read_cmd(i2c, msgs[0], cmd);
580 for (i = 0, j = msgs[1].len - 1; i < msgs[1].len && i < 4; i++, j--)
581 msgs[1].buf[j] = (cmd >> (8 * i)) & 0xff;
583 if (msgs[1].len > 4) {
585 for (i = 0; i < msgs[1].len - 4 && i < 4; i++, j--)
586 msgs[1].buf[j] = (cmd >> (8 * i)) & 0xff;
594 static int octeon_i2c_hlc_comp_write(struct octeon_i2c *i2c, struct i2c_msg *msgs)
604 cmd |= (u64)(msgs[1].len - 1) << SW_TWSI_SIZE_SHIFT;
606 cmd |= (u64)(msgs[0].addr & 0x7full) << SW_TWSI_ADDR_SHIFT;
609 set_ext = octeon_i2c_hlc_ext(i2c, msgs[0], &cmd, &ext);
611 for (i = 0, j = msgs[1].len - 1; i < msgs[1].len && i < 4; i++, j--)
612 cmd |= (u64)msgs[1].buf[j] << (8 * i);
614 if (msgs[1].len > 4) {
615 for (i = 0; i < msgs[1].len - 4 && i < 4; i++, j--)
616 ext |= (u64)msgs[1].buf[j] << (8 * i);
637 * @msgs: msg[0] contains address, place read data into msg[1]
646 static int octeon_i2c_hlc_block_comp_read(struct octeon_i2c *i2c, struct i2c_msg *msgs)
656 len = msgs[1].len - 1;
661 cmd |= (u64)(msgs[0].addr & 0x7full) << SW_TWSI_ADDR_SHIFT;
664 ret = octeon_i2c_hlc_read_cmd(i2c, msgs[0], cmd);
681 memcpy(&msgs[1].buf[i], &rd, min(8, msgs[1].len - i));
692 * @msgs: msg[0] contains address, msg[1] contains data to be written
700 static int octeon_i2c_hlc_block_comp_write(struct octeon_i2c *i2c, struct i2c_msg *msgs)
711 len = msgs[1].len - 1;
716 cmd |= (u64)(msgs[0].addr & 0x7full) << SW_TWSI_ADDR_SHIFT;
719 set_ext = octeon_i2c_hlc_ext(i2c, msgs[0], &cmd, &ext);
728 memcpy(&buf, &msgs[1].buf[i], min(8, msgs[1].len - i));
756 * @msgs: Pointer to the messages to be processed
761 int octeon_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
768 if (msgs[0].len > 0 && msgs[0].len <= 8) {
769 if (msgs[0].flags & I2C_M_RD)
770 ret = octeon_i2c_hlc_read(i2c, msgs);
772 ret = octeon_i2c_hlc_write(i2c, msgs);
776 if ((msgs[0].flags & I2C_M_RD) == 0 &&
777 (msgs[1].flags & I2C_M_RECV_LEN) == 0 &&
778 msgs[0].len > 0 && msgs[0].len <= 2 &&
779 msgs[1].len > 0 &&
780 msgs[0].addr == msgs[1].addr) {
781 if (msgs[1].len <= 8) {
782 if (msgs[1].flags & I2C_M_RD)
783 ret = octeon_i2c_hlc_comp_read(i2c, msgs);
785 ret = octeon_i2c_hlc_comp_write(i2c, msgs);
787 } else if (msgs[1].len <= 1024 && OCTEON_REG_BLOCK_CTL(i2c)) {
788 if (msgs[1].flags & I2C_M_RD)
789 ret = octeon_i2c_hlc_block_comp_read(i2c, msgs);
791 ret = octeon_i2c_hlc_block_comp_write(i2c, msgs);
799 struct i2c_msg *pmsg = &msgs[i];