コード例 #1
0
/**
 * configure_fifo() - Configure USB BAM Pipe's data FIFO
 * @idx: USB BAM Pipe index
 * @ep: USB endpoint
 *
 * This function configures USB BAM data fifo using fetched pipe configuraion
 * using provided index value. This function needs to used before starting
 * endless transfer.
 */
static void configure_fifo(u8 idx, struct usb_ep *ep)
{
	struct u_bam_data_connect_info bam_info;
	struct sps_mem_buffer data_fifo = {0};

	get_bam2bam_connection_info(idx, &bam_info.usb_bam_handle,
				&bam_info.usb_bam_pipe_idx,
				&bam_info.peer_pipe_idx,
				NULL, &data_fifo, NULL);
	msm_data_fifo_config(ep, data_fifo.phys_base, data_fifo.size,
			bam_info.usb_bam_pipe_idx);
}
コード例 #2
0
/*
 * This function configured data fifo based on index passed to get bam2bam
 * configuration.
 */
static void configure_usb_data_fifo(u8 idx, struct usb_ep *ep,
		enum usb_bam_pipe_type pipe_type)
{
	struct u_bam_data_connect_info bam_info;
	struct sps_mem_buffer data_fifo = {0};

	if (pipe_type == USB_BAM_PIPE_BAM2BAM) {
		get_bam2bam_connection_info(idx,
					&bam_info.usb_bam_handle,
					&bam_info.usb_bam_pipe_idx,
					&bam_info.peer_pipe_idx,
					NULL, &data_fifo);

		msm_data_fifo_config(ep,
					data_fifo.phys_base,
					data_fifo.size,
					bam_info.usb_bam_pipe_idx);
	}
}
コード例 #3
0
static int set_qdss_data_connection(struct usb_gadget *gadget,
	struct usb_ep *data_ep, u8 data_addr, int enable)
{
	int res = 0;
	u8 idx;

	pr_debug("set_qdss_data_connection\n");

	/* There is only one qdss pipe, so the pipe number can be set to 0 */
	idx = usb_bam_get_connection_idx(gadget->name, QDSS_P_BAM,
		PEER_PERIPHERAL_TO_USB, 0);
	if (idx < 0) {
		pr_err("%s: usb_bam_get_connection_idx failed\n", __func__);
		return idx;
	}

	if (enable) {
		res = usb_bam_connect(idx, &(bam_info.usb_bam_pipe_idx));
		bam_info.data_fifo =
			kzalloc(sizeof(struct sps_mem_buffer), GFP_KERNEL);
		if (!bam_info.data_fifo) {
			pr_err("qdss_data_connection: memory alloc failed\n");
			return -ENOMEM;
		}
		usb_bam_set_qdss_core(gadget->name);
		get_bam2bam_connection_info(idx,
			&bam_info.usb_bam_handle,
			&bam_info.usb_bam_pipe_idx, &bam_info.peer_pipe_idx,
			NULL, bam_info.data_fifo);

		msm_data_fifo_config(data_ep, bam_info.data_fifo->phys_base,
			bam_info.data_fifo->size, bam_info.usb_bam_pipe_idx);
	} else {
		kfree(bam_info.data_fifo);
		res = usb_bam_disconnect_pipe(idx);
		if (res) {
			pr_err("usb_bam_disconnection error\n");
			return res;
		}
	}

	return res;
}
コード例 #4
0
int set_qdss_data_connection(struct usb_ep *data_ep, u8 data_addr, int enable)
{
	int res = 0;

	pr_debug("set_qdss_data_connection\n");

	if (enable) {
		res = usb_bam_connect(BAM_CONNC_IDX, NULL,
			&(bam_info.usb_bam_pipe_idx));
		if (res) {
			pr_err("usb_bam_connection error\n");
			return res;
		}

		bam_info.data_fifo =
			kzalloc(sizeof(struct sps_mem_buffer *), GFP_KERNEL);
		if (!bam_info.data_fifo) {
			pr_err("qdss_data_connection: memory alloc failed\n");
			return -ENOMEM;
		}
		get_bam2bam_connection_info(BAM_CONNC_IDX,
			PEER_PERIPHERAL_TO_USB, &bam_info.usb_bam_handle,
			&bam_info.usb_bam_pipe_idx, &bam_info.peer_pipe_idx,
			NULL, bam_info.data_fifo);

		msm_data_fifo_config(data_ep, bam_info.data_fifo->phys_base,
			bam_info.data_fifo->size, bam_info.usb_bam_pipe_idx);
	} else {
		kfree(bam_info.data_fifo);
		res = usb_bam_disconnect_pipe(BAM_CONNC_IDX);
		if (res) {
			pr_err("usb_bam_disconnection error\n");
			return res;
		}

	}
	return res;
}