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

Commit ee3d7107 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "usb: gadget: Enable/Disable USB_BAM based on composition"

parents 3a264b5f 9ff1e2f9
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:

+71 −34
Original line number Diff line number Diff line
@@ -2969,9 +2969,6 @@ static struct msm_usb_bam_data *usb_bam_dt_to_data(
	else
		usb_bam_data->override_threshold = threshold;

	usb_bam_data->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++;

@@ -3095,48 +3092,42 @@ static struct msm_usb_bam_data *usb_bam_dt_to_data(
	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 usb_bam_ctx_type *ctx = dev_get_drvdata(&pdev->dev);
	enum usb_ctrl bam_type = ctx->usb_bam_data->bam_type;
	struct sps_bam_props props;
	struct device *dev;

	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_size = resource_size(ctx->io_res);
	props.irq = ctx->irq;
	props.summing_threshold = ctx->usb_bam_data->override_threshold;
	props.event_threshold = ctx->usb_bam_data->override_threshold;
	props.num_pipes = ctx->usb_bam_data->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 = ctx->usb_bam_data->override_threshold;
	props->event_threshold = ctx->usb_bam_data->override_threshold;
	props->num_pipes = ctx->usb_bam_data->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 (ctx->usb_bam_data->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 (ctx->usb_bam_data->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 (ctx->usb_bam_data->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;
	}

	dev = &ctx->usb_bam_pdev->dev;
@@ -3145,9 +3136,29 @@ static int usb_bam_init(struct platform_device *pdev)
						"qcom,smmu-s1-bypass")) {
		pr_info("%s: setting SPS_BAM_SMMU_EN flag with (%s)\n",
						__func__, dev_name(dev));
		props.options |= SPS_BAM_SMMU_EN;
		props->options |= SPS_BAM_SMMU_EN;
	}
}

static int usb_bam_init(struct platform_device *pdev)
{
	int ret;
	struct usb_bam_ctx_type *ctx = dev_get_drvdata(&pdev->dev);
	enum usb_ctrl bam_type = ctx->usb_bam_data->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);
@@ -3428,7 +3439,7 @@ int msm_do_bam_disable_enable(enum usb_ctrl bam)
		return 0;

	usb_bam_data = ctx->usb_bam_data;
	if ((bam != CI_CTRL) || !usb_bam_data->enable_hsusb_bam_on_boot)
	if (bam != CI_CTRL)
		return 0;

	if (!ctx->pipes_enabled_per_bam || info[bam].pipes_suspended)
@@ -3532,18 +3543,44 @@ bool msm_usb_bam_enable(enum usb_ctrl bam, bool bam_enable)
{
	struct msm_usb_bam_data *usb_bam_data;
	struct usb_bam_ctx_type *ctx = &msm_usb_bam[bam];
	static bool bam_enabled;
	int ret;

	if (!ctx->usb_bam_pdev)
		return 0;

	usb_bam_data = ctx->usb_bam_data;
	if ((bam != CI_CTRL) || !(bam_enable ||
					usb_bam_data->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;
}
+2 −0
Original line number Diff line number Diff line
@@ -1063,6 +1063,7 @@ rndis_qc_bind(struct usb_configuration *c, struct usb_function *f)
	 * until we're activated via set_alt().
	 */

	c->cdev->gadget->bam2bam_func_enabled = true;
	DBG(cdev, "RNDIS: %s speed IN/%s OUT/%s NOTIFY/%s\n",
			gadget_is_superspeed(c->cdev->gadget) ? "super" :
			gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
@@ -1116,6 +1117,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);

+2 −1
Original line number Diff line number Diff line
@@ -478,6 +478,7 @@ static int qdss_bind(struct usb_configuration *c, struct usb_function *f)
		}
	}

	c->cdev->gadget->bam2bam_func_enabled = true;
	return 0;
fail:
	clear_eps(f);
@@ -494,7 +495,7 @@ static void qdss_unbind(struct usb_configuration *c, struct usb_function *f)
	pr_debug("qdss_unbind\n");

	flush_workqueue(qdss->wq);

	c->cdev->gadget->bam2bam_func_enabled = false;
	clear_eps(f);
	clear_desc(gadget, f);
}
+5 −0
Original line number Diff line number Diff line
@@ -480,6 +480,8 @@ static void frmnet_unbind(struct usb_configuration *c, struct usb_function *f)

	if (dev->notify_req)
		frmnet_free_req(dev->notify, dev->notify_req);

	c->cdev->gadget->bam2bam_func_enabled = false;
}

static void frmnet_purge_responses(struct f_rmnet *dev)
@@ -1116,6 +1118,9 @@ static int frmnet_bind(struct usb_configuration *c, struct usb_function *f)
		return dev->ifc_id;
	}

	if (dev->xport_type == BAM2BAM_IPA)
		c->cdev->gadget->bam2bam_func_enabled = true;

	info.data_str_idx = 0;
	if (dev->qti_port_type == QTI_PORT_RMNET) {
		info.string_defs = rmnet_string_defs;
Loading