Loading Documentation/devicetree/bindings/platform/msm/usb-bam.txt +0 −1 Original line number Original line 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 - 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. 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,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: 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 Original line Diff line number Diff line Loading @@ -49,8 +49,6 @@ <&clock_gcc clk_xo_otg_clk>; <&clock_gcc clk_xo_otg_clk>; qcom,usbbam@78c4000 { qcom,usbbam@78c4000 { qcom,enable-hsusb-bam-on-boot; /delete-property/ qcom,reset-bam-on-disconnect; /delete-property/ qcom,reset-bam-on-disconnect; /delete-node/ qcom,pipe0; /delete-node/ qcom,pipe0; qcom,pipe0 { qcom,pipe0 { Loading arch/arm/boot/dts/qcom/msm8940.dtsi +0 −2 Original line number Original line Diff line number Diff line Loading @@ -38,8 +38,6 @@ <&clock_gcc clk_xo_otg_clk>; <&clock_gcc clk_xo_otg_clk>; qcom,usbbam@78c4000 { qcom,usbbam@78c4000 { qcom,enable-hsusb-bam-on-boot; /delete-property/ qcom,reset-bam-on-disconnect; /delete-property/ qcom,reset-bam-on-disconnect; /delete-node/ qcom,pipe0; /delete-node/ qcom,pipe0; qcom,pipe0 { qcom,pipe0 { Loading drivers/platform/msm/usb_bam.c +75 −35 Original line number Original line Diff line number Diff line Loading @@ -2887,9 +2887,6 @@ static struct msm_usb_bam_platform_data *usb_bam_dt_to_pdata( else else pdata->override_threshold = threshold; 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) for_each_child_of_node(pdev->dev.of_node, node) max_connections++; max_connections++; Loading Loading @@ -3013,53 +3010,72 @@ err: return NULL; 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; struct msm_usb_bam_platform_data *pdata = pdev->dev.platform_data; enum usb_ctrl bam_type = pdata->bam_type; enum usb_ctrl bam_type = pdata->bam_type; struct usb_bam_ctx_type *ctx = &msm_usb_bam[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->phys_addr = ctx->io_res->start; props.virt_addr = ctx->regs; props->virt_addr = NULL; props.virt_size = resource_size(ctx->io_res); props->virt_size = resource_size(ctx->io_res); props.irq = ctx->irq; props->irq = ctx->irq; props.summing_threshold = pdata->override_threshold; props->summing_threshold = pdata->override_threshold; props.event_threshold = pdata->override_threshold; props->event_threshold = pdata->override_threshold; props.num_pipes = pdata->usb_bam_num_pipes; props->num_pipes = pdata->usb_bam_num_pipes; props.callback = usb_bam_sps_events; props->callback = usb_bam_sps_events; props.user = bam_enable_strings[bam_type]; props->user = bam_enable_strings[bam_type]; /* /* * HSUSB and HSIC Cores don't support RESET ACK signal to BAMs * HSUSB and HSIC Cores don't support RESET ACK signal to BAMs * Hence, let BAM to ignore acknowledge from USB while resetting PIPE * Hence, let BAM to ignore acknowledge from USB while resetting PIPE */ */ if (pdata->ignore_core_reset_ack && bam_type != DWC3_CTRL) 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) 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 * starting peripheral controller to avoid switching USB core mode * from legacy to BAM with ongoing data transfers. * from legacy to BAM with ongoing data transfers. */ */ if (pdata->enable_hsusb_bam_on_boot && bam_type == CI_CTRL) { if (bam_type == CI_CTRL) { pr_debug("Register and enable HSUSB BAM\n"); log_event_dbg("Register and enable HSUSB BAM\n"); props.options |= SPS_BAM_OPT_ENABLE_AT_BOOT; props->options |= SPS_BAM_OPT_ENABLE_AT_BOOT; props.options |= SPS_BAM_FORCE_RESET; 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); ret = sps_register_bam_device(&props, &ctx->h_bam); if (ret < 0) { 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; return -EFAULT; } } Loading Loading @@ -3418,7 +3434,7 @@ int msm_do_bam_disable_enable(enum usb_ctrl bam) return 0; return 0; pdata = ctx->usb_bam_pdev->dev.platform_data; pdata = ctx->usb_bam_pdev->dev.platform_data; if ((bam != CI_CTRL) || !pdata->enable_hsusb_bam_on_boot) if (bam != CI_CTRL) return 0; return 0; if (!ctx->pipes_enabled_per_bam || info[bam].pipes_suspended) 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) 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]; struct usb_bam_ctx_type *ctx = &msm_usb_bam[bam]; static bool bam_enabled; int ret; if (!ctx->usb_bam_pdev) if (!ctx->usb_bam_pdev) return 0; return 0; pdata = ctx->usb_bam_pdev->dev.platform_data; if (bam != CI_CTRL) if ((bam != CI_CTRL) || !(bam_enable || return 0; pdata->enable_hsusb_bam_on_boot)) if (bam_enabled == bam_enable) { log_event_dbg("%s: USB BAM is already %s\n", __func__, bam_enable ? "Registered" : "De-registered"); return 0; 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); 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); 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; return 0; } } Loading drivers/usb/gadget/ci13xxx_udc.c +27 −14 Original line number Original line 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; gadget_ready = 1; spin_unlock_irqrestore(udc->lock, flags); spin_unlock_irqrestore(udc->lock, flags); if (gadget_ready) { if (!gadget_ready) return 0; if (is_active) { if (is_active) { hw_device_reset(udc); hw_device_reset(udc); if (udc->udc_driver->notify_event) if (udc->udc_driver->notify_event) udc->udc_driver->notify_event(udc, udc->udc_driver->notify_event(udc, CI13XXX_CONTROLLER_CONNECT_EVENT); 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); hw_device_state(udc->ep0out.qh.dma); } } else { } else { hw_device_state(0); hw_device_state(0); _gadget_stop_activity(&udc->gadget); _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, udc->udc_driver->notify_event(udc, CI13XXX_CONTROLLER_DISCONNECT_EVENT); CI13XXX_CONTROLLER_DISCONNECT_EVENT); } } } return 0; 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); 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); spin_lock_irqsave(udc->lock, flags); if (!udc->vbus_active) { if (!udc->vbus_active) { spin_unlock_irqrestore(udc->lock, flags); spin_unlock_irqrestore(udc->lock, flags); Loading Loading
Documentation/devicetree/bindings/platform/msm/usb-bam.txt +0 −1 Original line number Original line 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 - 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. 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,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: 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 Original line Diff line number Diff line Loading @@ -49,8 +49,6 @@ <&clock_gcc clk_xo_otg_clk>; <&clock_gcc clk_xo_otg_clk>; qcom,usbbam@78c4000 { qcom,usbbam@78c4000 { qcom,enable-hsusb-bam-on-boot; /delete-property/ qcom,reset-bam-on-disconnect; /delete-property/ qcom,reset-bam-on-disconnect; /delete-node/ qcom,pipe0; /delete-node/ qcom,pipe0; qcom,pipe0 { qcom,pipe0 { Loading
arch/arm/boot/dts/qcom/msm8940.dtsi +0 −2 Original line number Original line Diff line number Diff line Loading @@ -38,8 +38,6 @@ <&clock_gcc clk_xo_otg_clk>; <&clock_gcc clk_xo_otg_clk>; qcom,usbbam@78c4000 { qcom,usbbam@78c4000 { qcom,enable-hsusb-bam-on-boot; /delete-property/ qcom,reset-bam-on-disconnect; /delete-property/ qcom,reset-bam-on-disconnect; /delete-node/ qcom,pipe0; /delete-node/ qcom,pipe0; qcom,pipe0 { qcom,pipe0 { Loading
drivers/platform/msm/usb_bam.c +75 −35 Original line number Original line Diff line number Diff line Loading @@ -2887,9 +2887,6 @@ static struct msm_usb_bam_platform_data *usb_bam_dt_to_pdata( else else pdata->override_threshold = threshold; 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) for_each_child_of_node(pdev->dev.of_node, node) max_connections++; max_connections++; Loading Loading @@ -3013,53 +3010,72 @@ err: return NULL; 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; struct msm_usb_bam_platform_data *pdata = pdev->dev.platform_data; enum usb_ctrl bam_type = pdata->bam_type; enum usb_ctrl bam_type = pdata->bam_type; struct usb_bam_ctx_type *ctx = &msm_usb_bam[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->phys_addr = ctx->io_res->start; props.virt_addr = ctx->regs; props->virt_addr = NULL; props.virt_size = resource_size(ctx->io_res); props->virt_size = resource_size(ctx->io_res); props.irq = ctx->irq; props->irq = ctx->irq; props.summing_threshold = pdata->override_threshold; props->summing_threshold = pdata->override_threshold; props.event_threshold = pdata->override_threshold; props->event_threshold = pdata->override_threshold; props.num_pipes = pdata->usb_bam_num_pipes; props->num_pipes = pdata->usb_bam_num_pipes; props.callback = usb_bam_sps_events; props->callback = usb_bam_sps_events; props.user = bam_enable_strings[bam_type]; props->user = bam_enable_strings[bam_type]; /* /* * HSUSB and HSIC Cores don't support RESET ACK signal to BAMs * HSUSB and HSIC Cores don't support RESET ACK signal to BAMs * Hence, let BAM to ignore acknowledge from USB while resetting PIPE * Hence, let BAM to ignore acknowledge from USB while resetting PIPE */ */ if (pdata->ignore_core_reset_ack && bam_type != DWC3_CTRL) 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) 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 * starting peripheral controller to avoid switching USB core mode * from legacy to BAM with ongoing data transfers. * from legacy to BAM with ongoing data transfers. */ */ if (pdata->enable_hsusb_bam_on_boot && bam_type == CI_CTRL) { if (bam_type == CI_CTRL) { pr_debug("Register and enable HSUSB BAM\n"); log_event_dbg("Register and enable HSUSB BAM\n"); props.options |= SPS_BAM_OPT_ENABLE_AT_BOOT; props->options |= SPS_BAM_OPT_ENABLE_AT_BOOT; props.options |= SPS_BAM_FORCE_RESET; 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); ret = sps_register_bam_device(&props, &ctx->h_bam); if (ret < 0) { 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; return -EFAULT; } } Loading Loading @@ -3418,7 +3434,7 @@ int msm_do_bam_disable_enable(enum usb_ctrl bam) return 0; return 0; pdata = ctx->usb_bam_pdev->dev.platform_data; pdata = ctx->usb_bam_pdev->dev.platform_data; if ((bam != CI_CTRL) || !pdata->enable_hsusb_bam_on_boot) if (bam != CI_CTRL) return 0; return 0; if (!ctx->pipes_enabled_per_bam || info[bam].pipes_suspended) 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) 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]; struct usb_bam_ctx_type *ctx = &msm_usb_bam[bam]; static bool bam_enabled; int ret; if (!ctx->usb_bam_pdev) if (!ctx->usb_bam_pdev) return 0; return 0; pdata = ctx->usb_bam_pdev->dev.platform_data; if (bam != CI_CTRL) if ((bam != CI_CTRL) || !(bam_enable || return 0; pdata->enable_hsusb_bam_on_boot)) if (bam_enabled == bam_enable) { log_event_dbg("%s: USB BAM is already %s\n", __func__, bam_enable ? "Registered" : "De-registered"); return 0; 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); 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); 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; return 0; } } Loading
drivers/usb/gadget/ci13xxx_udc.c +27 −14 Original line number Original line 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; gadget_ready = 1; spin_unlock_irqrestore(udc->lock, flags); spin_unlock_irqrestore(udc->lock, flags); if (gadget_ready) { if (!gadget_ready) return 0; if (is_active) { if (is_active) { hw_device_reset(udc); hw_device_reset(udc); if (udc->udc_driver->notify_event) if (udc->udc_driver->notify_event) udc->udc_driver->notify_event(udc, udc->udc_driver->notify_event(udc, CI13XXX_CONTROLLER_CONNECT_EVENT); 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); hw_device_state(udc->ep0out.qh.dma); } } else { } else { hw_device_state(0); hw_device_state(0); _gadget_stop_activity(&udc->gadget); _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, udc->udc_driver->notify_event(udc, CI13XXX_CONTROLLER_DISCONNECT_EVENT); CI13XXX_CONTROLLER_DISCONNECT_EVENT); } } } return 0; 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); 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); spin_lock_irqsave(udc->lock, flags); if (!udc->vbus_active) { if (!udc->vbus_active) { spin_unlock_irqrestore(udc->lock, flags); spin_unlock_irqrestore(udc->lock, flags); Loading