Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ea3e4e39 authored by Chandana Kishori Chiluveru's avatar Chandana Kishori Chiluveru
Browse files

usb: gadget: Enable/Disable USB_BAM based on composition



BAM is used only in USB BAM mode. If platform has BAM enabled
by default in peripheral mode then it may slow down DDR access
by USB and also observing throughput degradation for software path
transfers. Since, USB legacy mode doesn't use BAM2BAM mode disable
the same for USB legacy mode and enable USB BAM based on composition.

Change-Id: I564caea896fb6b7b7acef12dc72e1bf179977b3f
Signed-off-by: default avatarChandana Kishori Chiluveru <cchiluve@codeaurora.org>
parent de631022
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ Optional properties:
- qcom,reset-bam-on-connect: If present then BAM is RESET before connecting
  pipe. This may be required if BAM peripheral is also reset before connect.
- qcom,reset-bam-on-disconnect: If present then BAM is RESET after disconnecting pipes.
- qcom,enable-hsusb-bam-on-boot: If present then BAM is enabled at bootup itself.

A number of USB BAM pipe parameters are represented as sub-nodes:

+75 −35
Original line number Diff line number Diff line
@@ -2887,9 +2887,6 @@ static struct msm_usb_bam_platform_data *usb_bam_dt_to_pdata(
	else
		pdata->override_threshold = threshold;

	pdata->enable_hsusb_bam_on_boot = of_property_read_bool(node,
		"qcom,enable-hsusb-bam-on-boot");

	for_each_child_of_node(pdev->dev.of_node, node)
		max_connections++;

@@ -3013,53 +3010,72 @@ err:
	return NULL;
}

static int usb_bam_init(struct platform_device *pdev)
static void msm_usb_bam_update_props(struct sps_bam_props *props,
				struct platform_device *pdev)
{
	int ret;
	struct msm_usb_bam_platform_data *pdata = pdev->dev.platform_data;
	enum usb_ctrl bam_type = pdata->bam_type;
	struct usb_bam_ctx_type *ctx = &msm_usb_bam[bam_type];
	struct sps_bam_props props;

	memset(&props, 0, sizeof(props));

	pr_debug("%s: usb_bam_init - %s\n", __func__,
		bam_enable_strings[bam_type]);

	props.phys_addr = ctx->io_res->start;
	props.virt_addr = ctx->regs;
	props.virt_size = resource_size(ctx->io_res);
	props.irq = ctx->irq;
	props.summing_threshold = pdata->override_threshold;
	props.event_threshold = pdata->override_threshold;
	props.num_pipes = pdata->usb_bam_num_pipes;
	props.callback = usb_bam_sps_events;
	props.user = bam_enable_strings[bam_type];
	props->phys_addr = ctx->io_res->start;
	props->virt_addr = NULL;
	props->virt_size = resource_size(ctx->io_res);
	props->irq = ctx->irq;
	props->summing_threshold = pdata->override_threshold;
	props->event_threshold = pdata->override_threshold;
	props->num_pipes = pdata->usb_bam_num_pipes;
	props->callback = usb_bam_sps_events;
	props->user = bam_enable_strings[bam_type];

	/*
	* HSUSB and HSIC Cores don't support RESET ACK signal to BAMs
	* Hence, let BAM to ignore acknowledge from USB while resetting PIPE
	*/
	if (pdata->ignore_core_reset_ack && bam_type != DWC3_CTRL)
		props.options = SPS_BAM_NO_EXT_P_RST;
		props->options = SPS_BAM_NO_EXT_P_RST;

	if (pdata->disable_clk_gating)
		props.options |= SPS_BAM_NO_LOCAL_CLK_GATING;
		props->options |= SPS_BAM_NO_LOCAL_CLK_GATING;

	/*
	 * HSUSB BAM is not NDP BAM and it must be enabled early before
	 * HSUSB BAM is not NDP BAM and it must be enabled before
	 * starting peripheral controller to avoid switching USB core mode
	 * from legacy to BAM with ongoing data transfers.
	 */
	if (pdata->enable_hsusb_bam_on_boot && bam_type == CI_CTRL) {
		pr_debug("Register and enable HSUSB BAM\n");
		props.options |= SPS_BAM_OPT_ENABLE_AT_BOOT;
		props.options |= SPS_BAM_FORCE_RESET;
	if (bam_type == CI_CTRL) {
		log_event_dbg("Register and enable HSUSB BAM\n");
		props->options |= SPS_BAM_OPT_ENABLE_AT_BOOT;
		props->options |= SPS_BAM_FORCE_RESET;
	}
}

static int usb_bam_init(struct platform_device *pdev)
{
	int ret;
	struct msm_usb_bam_platform_data *pdata = pdev->dev.platform_data;
	enum usb_ctrl bam_type = pdata->bam_type;
	struct usb_bam_ctx_type *ctx = &msm_usb_bam[bam_type];
	struct sps_bam_props props;


	pr_debug("%s: usb_bam_init - %s\n", __func__,
		bam_enable_strings[bam_type]);

	/*
	 * CI USB2 BAM is registered before starting controller
	 * and only if bam2bam function is present in composition
	 */
	if (bam_type == CI_CTRL)
		return 0;

	memset(&props, 0, sizeof(props));
	msm_usb_bam_update_props(&props, pdev);
	ret = sps_register_bam_device(&props, &ctx->h_bam);

	if (ret < 0) {
		log_event_err("%s: register bam error %d\n", __func__, ret);
		log_event_err("%s: register bam error %d\n",
				__func__, ret);
		return -EFAULT;
	}

@@ -3418,7 +3434,7 @@ int msm_do_bam_disable_enable(enum usb_ctrl bam)
		return 0;

	pdata = ctx->usb_bam_pdev->dev.platform_data;
	if ((bam != CI_CTRL) || !pdata->enable_hsusb_bam_on_boot)
	if (bam != CI_CTRL)
		return 0;

	if (!ctx->pipes_enabled_per_bam || info[bam].pipes_suspended)
@@ -3520,20 +3536,44 @@ EXPORT_SYMBOL(msm_do_bam_disable_enable);

bool msm_usb_bam_enable(enum usb_ctrl bam, bool bam_enable)
{
	struct msm_usb_bam_platform_data *pdata;
	struct usb_bam_ctx_type *ctx = &msm_usb_bam[bam];
	static bool bam_enabled;
	int ret;

	if (!ctx->usb_bam_pdev)
		return 0;

	pdata = ctx->usb_bam_pdev->dev.platform_data;
	if ((bam != CI_CTRL) || !(bam_enable ||
					pdata->enable_hsusb_bam_on_boot))
	if (bam != CI_CTRL)
		return 0;

	if (bam_enabled == bam_enable) {
		log_event_dbg("%s: USB BAM is already %s\n", __func__,
				bam_enable ? "Registered" : "De-registered");
		return 0;
	}

	if (bam_enable) {
		struct sps_bam_props props;

		memset(&props, 0, sizeof(props));
		msm_usb_bam_update_props(&props, ctx->usb_bam_pdev);
		msm_hw_bam_disable(1);
	sps_device_reset(ctx->h_bam);
		ret = sps_register_bam_device(&props, &ctx->h_bam);
		bam_enabled = true;
		if (ret < 0) {
			log_event_err("%s: register bam error %d\n",
					__func__, ret);
			return -EFAULT;
		}
		log_event_dbg("%s: USB BAM Registered\n", __func__);
		msm_hw_bam_disable(0);
	} else {
		msm_hw_bam_disable(1);
		sps_device_reset(ctx->h_bam);
		sps_deregister_bam_device(ctx->h_bam);
		log_event_dbg("%s: USB BAM De-registered\n", __func__);
		bam_enabled = false;
	}

	return 0;
}
+27 −14
Original line number Diff line number Diff line
@@ -3427,14 +3427,22 @@ static int ci13xxx_vbus_session(struct usb_gadget *_gadget, int is_active)
		gadget_ready = 1;
	spin_unlock_irqrestore(udc->lock, flags);

	if (gadget_ready) {
	if (!gadget_ready)
		return 0;

	if (is_active) {
		hw_device_reset(udc);
		if (udc->udc_driver->notify_event)
			udc->udc_driver->notify_event(udc,
				CI13XXX_CONTROLLER_CONNECT_EVENT);
			if (udc->softconnect)
		/* Enable BAM (if needed) before starting controller */
		if (udc->softconnect) {
			dbg_event(0xFF, "BAM EN2",
				_gadget->bam2bam_func_enabled);
			msm_usb_bam_enable(CI_CTRL,
				_gadget->bam2bam_func_enabled);
			hw_device_state(udc->ep0out.qh.dma);
		}
	} else {
		hw_device_state(0);
		_gadget_stop_activity(&udc->gadget);
@@ -3442,7 +3450,6 @@ static int ci13xxx_vbus_session(struct usb_gadget *_gadget, int is_active)
			udc->udc_driver->notify_event(udc,
				CI13XXX_CONTROLLER_DISCONNECT_EVENT);
	}
	}

	return 0;
}
@@ -3488,6 +3495,12 @@ static int ci13xxx_pullup(struct usb_gadget *_gadget, int is_active)

	pm_runtime_get_sync(&_gadget->dev);

	/* Enable BAM (if needed) before starting controller */
	if (is_active) {
		dbg_event(0xFF, "BAM EN1", _gadget->bam2bam_func_enabled);
		msm_usb_bam_enable(CI_CTRL, _gadget->bam2bam_func_enabled);
	}

	spin_lock_irqsave(udc->lock, flags);
	if (!udc->vbus_active) {
		spin_unlock_irqrestore(udc->lock, flags);
+2 −0
Original line number Diff line number Diff line
@@ -1084,6 +1084,7 @@ rndis_qc_unbind(struct usb_configuration *c, struct usb_function *f)
		usb_free_descriptors(f->hs_descriptors);
	usb_free_descriptors(f->fs_descriptors);

	c->cdev->gadget->bam2bam_func_enabled = false;
	kfree(rndis->notify_req->buf);
	usb_ep_free_request(rndis->notify, rndis->notify_req);

@@ -1304,6 +1305,7 @@ rndis_qc_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
			rndis_ipa_cleanup(rndis_ipa_params.private);
		goto fail;
	}
	c->cdev->gadget->bam2bam_func_enabled = true;

	return 0;

+4 −0
Original line number Diff line number Diff line
@@ -487,7 +487,10 @@ static void qdss_unbind(struct usb_configuration *c, struct usb_function *f)
	pr_debug("qdss_unbind\n");

	flush_workqueue(qdss->wq);
	ipa_data_flush_workqueue();


	c->cdev->gadget->bam2bam_func_enabled = false;
	clear_eps(f);
	clear_desc(gadget, f);

@@ -1040,6 +1043,7 @@ static int qdss_bind_config(struct usb_configuration *c, unsigned char portno)
		kfree(name);
		kfree(qdss);
	}
	c->cdev->gadget->bam2bam_func_enabled = true;

	return status;
}
Loading