int tcpm_transmit(int port, enum tcpm_transmit_type type, uint16_t header, const uint32_t *data) { int reg = TCPC_REG_TX_DATA; int rv, cnt = 4*PD_HEADER_CNT(header); rv = i2c_write8(I2C_PORT_TCPC, I2C_ADDR_TCPC(port), TCPC_REG_TX_BYTE_CNT, cnt); rv |= i2c_write16(I2C_PORT_TCPC, I2C_ADDR_TCPC(port), TCPC_REG_TX_HDR, header); /* If i2c read fails, return error */ if (rv) return rv; if (cnt > 0) { i2c_lock(I2C_PORT_TCPC, 1); rv = i2c_xfer(I2C_PORT_TCPC, I2C_ADDR_TCPC(port), (uint8_t *)®, 1, NULL, 0, I2C_XFER_START); rv |= i2c_xfer(I2C_PORT_TCPC, I2C_ADDR_TCPC(port), (uint8_t *)data, cnt, NULL, 0, I2C_XFER_STOP); i2c_lock(I2C_PORT_TCPC, 0); } /* If i2c read fails, return error */ if (rv) return rv; rv = i2c_write8(I2C_PORT_TCPC, I2C_ADDR_TCPC(port), TCPC_REG_TRANSMIT, TCPC_REG_TRANSMIT_SET(type)); return rv; }
static int tcpci_tcpm_transmit(int port, enum tcpm_transmit_type type, uint16_t header, const uint32_t *data) { int reg = TCPC_REG_TX_DATA; int rv, cnt = 4*PD_HEADER_CNT(header); /* TX_BYTE_CNT includes 2 bytes for message header */ rv = tcpc_write(port, TCPC_REG_TX_BYTE_CNT, cnt + 2); rv |= tcpc_write16(port, TCPC_REG_TX_HDR, header); /* If tcpc read fails, return error */ if (rv) return rv; if (cnt > 0) { tcpc_lock(port, 1); rv = tcpc_xfer(port, (uint8_t *)®, 1, NULL, 0, I2C_XFER_START); rv |= tcpc_xfer(port, (uint8_t *)data, cnt, NULL, 0, I2C_XFER_STOP); tcpc_lock(port, 0); } /* If tcpc read fails, return error */ if (rv) return rv; rv = tcpc_write(port, TCPC_REG_TRANSMIT, TCPC_REG_TRANSMIT_SET(type)); return rv; }