static int hci_cmd_v1_prep_ccc()

in master/mipi-i3c-hci/cmd_v1.c [172:220]


static int hci_cmd_v1_prep_ccc(struct i3c_hci *hci,
			       struct hci_xfer *xfer,
			       u8 ccc_addr, u8 ccc_cmd, bool raw)
{
	unsigned int dat_idx = 0;
	enum hci_cmd_mode mode = get_i3c_mode(hci);
	u8 *data = xfer->data;
	unsigned int data_len = xfer->data_len;
	bool rnw = xfer->rnw;
	int ret;

	/* this should never happen */
	if (WARN_ON(raw))
		return -EINVAL;

	if (ccc_addr != I3C_BROADCAST_ADDR) {
		ret = mipi_i3c_hci_dat_v1.get_index(hci, ccc_addr);
		if (ret < 0)
			return ret;
		dat_idx = ret;
	}

	xfer->cmd_tid = hci_get_tid();

	if (!rnw && data_len <= 4) {
		/* we use an Immediate Data Transfer Command */
		xfer->cmd_desc[0] =
			CMD_0_ATTR_I |
			CMD_I0_TID(xfer->cmd_tid) |
			CMD_I0_CMD(ccc_cmd) | CMD_I0_CP |
			CMD_I0_DEV_INDEX(dat_idx) |
			CMD_I0_DTT(data_len) |
			CMD_I0_MODE(mode);
		fill_data_bytes(xfer, data, data_len);
	} else {
		/* we use a Regular Data Transfer Command */
		xfer->cmd_desc[0] =
			CMD_0_ATTR_R |
			CMD_R0_TID(xfer->cmd_tid) |
			CMD_R0_CMD(ccc_cmd) | CMD_R0_CP |
			CMD_R0_DEV_INDEX(dat_idx) |
			CMD_R0_MODE(mode) |
			(rnw ? CMD_R0_RNW : 0);
		xfer->cmd_desc[1] =
			CMD_R1_DATA_LENGTH(data_len);
	}

	return 0;
}