Loading Documentation/devicetree/bindings/platform/msm/usb-bam.txt +0 −1 Original line number Diff line number Diff line Loading @@ -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: Loading drivers/platform/msm/usb_bam.c +71 −34 Original line number Diff line number Diff line Loading @@ -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++; Loading Loading @@ -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; Loading @@ -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); Loading Loading @@ -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) Loading Loading @@ -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; } Loading drivers/usb/gadget/function/f_qc_rndis.c +2 −0 Original line number Diff line number Diff line Loading @@ -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", Loading Loading @@ -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); Loading drivers/usb/gadget/function/f_qdss.c +2 −1 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); } Loading drivers/usb/gadget/function/f_rmnet.c +5 −0 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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 Loading
Documentation/devicetree/bindings/platform/msm/usb-bam.txt +0 −1 Original line number Diff line number Diff line Loading @@ -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: Loading
drivers/platform/msm/usb_bam.c +71 −34 Original line number Diff line number Diff line Loading @@ -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++; Loading Loading @@ -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; Loading @@ -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); Loading Loading @@ -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) Loading Loading @@ -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; } Loading
drivers/usb/gadget/function/f_qc_rndis.c +2 −0 Original line number Diff line number Diff line Loading @@ -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", Loading Loading @@ -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); Loading
drivers/usb/gadget/function/f_qdss.c +2 −1 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); } Loading
drivers/usb/gadget/function/f_rmnet.c +5 −0 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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