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 arch/arm/boot/dts/qcom/msm8920.dtsi +0 −2 Original line number Diff line number Diff line Loading @@ -49,8 +49,6 @@ <&clock_gcc clk_xo_otg_clk>; qcom,usbbam@78c4000 { qcom,enable-hsusb-bam-on-boot; /delete-property/ qcom,reset-bam-on-disconnect; /delete-node/ qcom,pipe0; qcom,pipe0 { Loading arch/arm/boot/dts/qcom/msm8940.dtsi +0 −2 Original line number Diff line number Diff line Loading @@ -38,8 +38,6 @@ <&clock_gcc clk_xo_otg_clk>; qcom,usbbam@78c4000 { qcom,enable-hsusb-bam-on-boot; /delete-property/ qcom,reset-bam-on-disconnect; /delete-node/ qcom,pipe0; qcom,pipe0 { Loading drivers/platform/msm/usb_bam.c +75 −35 Original line number Diff line number Diff line Loading @@ -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++; Loading Loading @@ -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; } Loading Loading @@ -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) Loading Loading @@ -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; } Loading drivers/usb/gadget/ci13xxx_udc.c +27 −14 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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; } Loading Loading @@ -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); 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
arch/arm/boot/dts/qcom/msm8920.dtsi +0 −2 Original line number Diff line number Diff line Loading @@ -49,8 +49,6 @@ <&clock_gcc clk_xo_otg_clk>; qcom,usbbam@78c4000 { qcom,enable-hsusb-bam-on-boot; /delete-property/ qcom,reset-bam-on-disconnect; /delete-node/ qcom,pipe0; qcom,pipe0 { Loading
arch/arm/boot/dts/qcom/msm8940.dtsi +0 −2 Original line number Diff line number Diff line Loading @@ -38,8 +38,6 @@ <&clock_gcc clk_xo_otg_clk>; qcom,usbbam@78c4000 { qcom,enable-hsusb-bam-on-boot; /delete-property/ qcom,reset-bam-on-disconnect; /delete-node/ qcom,pipe0; qcom,pipe0 { Loading
drivers/platform/msm/usb_bam.c +75 −35 Original line number Diff line number Diff line Loading @@ -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++; Loading Loading @@ -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; } Loading Loading @@ -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) Loading Loading @@ -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; } Loading
drivers/usb/gadget/ci13xxx_udc.c +27 −14 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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; } Loading Loading @@ -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); Loading