Loading arch/arm64/boot/dts/qcom/sm8150-usb.dtsi +10 −1 Original line number Original line Diff line number Diff line Loading @@ -55,15 +55,24 @@ qcom,dwc-usb3-msm-tx-fifo-size = <27696>; qcom,dwc-usb3-msm-tx-fifo-size = <27696>; qcom,msm-bus,name = "usb0"; qcom,msm-bus,name = "usb0"; qcom,msm-bus,num-cases = <2>; qcom,msm-bus,num-cases = <3>; qcom,msm-bus,num-paths = <3>; qcom,msm-bus,num-paths = <3>; qcom,msm-bus,vectors-KBps = qcom,msm-bus,vectors-KBps = /* suspend vote */ <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_EBI_CH0 0 0>, <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_EBI_CH0 0 0>, <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_IPA_CFG 0 0>, <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_IPA_CFG 0 0>, <MSM_BUS_MASTER_AMPSS_M0 MSM_BUS_SLAVE_USB3 0 0>, <MSM_BUS_MASTER_AMPSS_M0 MSM_BUS_SLAVE_USB3 0 0>, /* nominal vote */ <MSM_BUS_MASTER_USB3 <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_EBI_CH0 1000000 2500000>, MSM_BUS_SLAVE_EBI_CH0 1000000 2500000>, <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_IPA_CFG 0 2400>, <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_IPA_CFG 0 2400>, <MSM_BUS_MASTER_AMPSS_M0 MSM_BUS_SLAVE_USB3 0 40000>, /* svs vote */ <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_EBI_CH0 240000 700000>, <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_IPA_CFG 0 2400>, <MSM_BUS_MASTER_AMPSS_M0 MSM_BUS_SLAVE_USB3 0 40000>; <MSM_BUS_MASTER_AMPSS_M0 MSM_BUS_SLAVE_USB3 0 40000>; dwc3@a600000 { dwc3@a600000 { Loading drivers/usb/dwc3/dwc3-msm.c +61 −18 Original line number Original line Diff line number Diff line Loading @@ -2113,6 +2113,60 @@ static void configure_nonpdc_usb_interrupt(struct dwc3_msm *mdwc, } } } } enum bus_vote { BUS_VOTE_INVALID, BUS_VOTE_SUSPEND, BUS_VOTE_NOMINAL, BUS_VOTE_SVS }; static int dwc3_msm_update_bus_bw(struct dwc3_msm *mdwc, enum bus_vote bv) { int ret = 0; struct dwc3 *dwc = platform_get_drvdata(mdwc->dwc3); if (!mdwc->bus_perf_client) return 0; dbg_event(0xFF, "bus_vote_start", bv); switch (bv) { case BUS_VOTE_SVS: /* On some platforms SVS does not have separate vote. Vote for * nominal if svs usecase does not exist */ if (mdwc->bus_scale_table->num_usecases == 2) goto nominal_vote; /* index starts from zero */ ret = msm_bus_scale_client_update_request( mdwc->bus_perf_client, 2); if (ret) dev_err(mdwc->dev, "bus bw voting failed %d\n", ret); break; case BUS_VOTE_NOMINAL: nominal_vote: ret = msm_bus_scale_client_update_request( mdwc->bus_perf_client, 1); if (ret) dev_err(mdwc->dev, "bus bw voting failed %d\n", ret); break; case BUS_VOTE_SUSPEND: ret = msm_bus_scale_client_update_request( mdwc->bus_perf_client, 0); if (ret) dev_err(mdwc->dev, "bus bw voting failed %d\n", ret); break; default: dev_err(mdwc->dev, "Unsupported bus vote:%d\n", bv); ret = -EINVAL; } dbg_event(0xFF, "bus_vote_end", bv); return ret; } static int dwc3_msm_suspend(struct dwc3_msm *mdwc) static int dwc3_msm_suspend(struct dwc3_msm *mdwc) { { int ret; int ret; Loading Loading @@ -2244,15 +2298,7 @@ static int dwc3_msm_suspend(struct dwc3_msm *mdwc) } } } } /* Remove bus voting */ dwc3_msm_update_bus_bw(mdwc, BUS_VOTE_SUSPEND); if (mdwc->bus_perf_client) { dbg_event(0xFF, "bus_devote_start", 0); ret = msm_bus_scale_client_update_request( mdwc->bus_perf_client, 0); dbg_event(0xFF, "bus_devote_finish", 0); if (ret) dev_err(mdwc->dev, "bus bw unvoting failed %d\n", ret); } /* /* * release wakeup source with timeout to defer system suspend to * release wakeup source with timeout to defer system suspend to Loading Loading @@ -2310,15 +2356,10 @@ static int dwc3_msm_resume(struct dwc3_msm *mdwc) pm_stay_awake(mdwc->dev); pm_stay_awake(mdwc->dev); /* Enable bus voting */ if (mdwc->in_host_mode && mdwc->max_rh_port_speed == USB_SPEED_HIGH) if (mdwc->bus_perf_client) { dwc3_msm_update_bus_bw(mdwc, BUS_VOTE_SVS); dbg_event(0xFF, "bus_vote_start", 1); else ret = msm_bus_scale_client_update_request( dwc3_msm_update_bus_bw(mdwc, BUS_VOTE_NOMINAL); mdwc->bus_perf_client, 1); dbg_event(0xFF, "bus_vote_finish", 1); if (ret) dev_err(mdwc->dev, "bus bw voting failed %d\n", ret); } /* Vote for TCXO while waking up USB HSPHY */ /* Vote for TCXO while waking up USB HSPHY */ ret = clk_prepare_enable(mdwc->xo_clk); ret = clk_prepare_enable(mdwc->xo_clk); Loading Loading @@ -3503,6 +3544,7 @@ static int dwc3_msm_host_notifier(struct notifier_block *nb, "set hs core clk rate %ld\n", "set hs core clk rate %ld\n", mdwc->core_clk_rate_hs); mdwc->core_clk_rate_hs); mdwc->max_rh_port_speed = USB_SPEED_HIGH; mdwc->max_rh_port_speed = USB_SPEED_HIGH; dwc3_msm_update_bus_bw(mdwc, BUS_VOTE_SVS); } else { } else { mdwc->max_rh_port_speed = USB_SPEED_SUPER; mdwc->max_rh_port_speed = USB_SPEED_SUPER; } } Loading @@ -3512,6 +3554,7 @@ static int dwc3_msm_host_notifier(struct notifier_block *nb, dev_dbg(mdwc->dev, "set core clk rate %ld\n", dev_dbg(mdwc->dev, "set core clk rate %ld\n", mdwc->core_clk_rate); mdwc->core_clk_rate); mdwc->max_rh_port_speed = USB_SPEED_UNKNOWN; mdwc->max_rh_port_speed = USB_SPEED_UNKNOWN; dwc3_msm_update_bus_bw(mdwc, BUS_VOTE_NOMINAL); } } } } Loading Loading
arch/arm64/boot/dts/qcom/sm8150-usb.dtsi +10 −1 Original line number Original line Diff line number Diff line Loading @@ -55,15 +55,24 @@ qcom,dwc-usb3-msm-tx-fifo-size = <27696>; qcom,dwc-usb3-msm-tx-fifo-size = <27696>; qcom,msm-bus,name = "usb0"; qcom,msm-bus,name = "usb0"; qcom,msm-bus,num-cases = <2>; qcom,msm-bus,num-cases = <3>; qcom,msm-bus,num-paths = <3>; qcom,msm-bus,num-paths = <3>; qcom,msm-bus,vectors-KBps = qcom,msm-bus,vectors-KBps = /* suspend vote */ <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_EBI_CH0 0 0>, <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_EBI_CH0 0 0>, <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_IPA_CFG 0 0>, <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_IPA_CFG 0 0>, <MSM_BUS_MASTER_AMPSS_M0 MSM_BUS_SLAVE_USB3 0 0>, <MSM_BUS_MASTER_AMPSS_M0 MSM_BUS_SLAVE_USB3 0 0>, /* nominal vote */ <MSM_BUS_MASTER_USB3 <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_EBI_CH0 1000000 2500000>, MSM_BUS_SLAVE_EBI_CH0 1000000 2500000>, <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_IPA_CFG 0 2400>, <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_IPA_CFG 0 2400>, <MSM_BUS_MASTER_AMPSS_M0 MSM_BUS_SLAVE_USB3 0 40000>, /* svs vote */ <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_EBI_CH0 240000 700000>, <MSM_BUS_MASTER_USB3 MSM_BUS_SLAVE_IPA_CFG 0 2400>, <MSM_BUS_MASTER_AMPSS_M0 MSM_BUS_SLAVE_USB3 0 40000>; <MSM_BUS_MASTER_AMPSS_M0 MSM_BUS_SLAVE_USB3 0 40000>; dwc3@a600000 { dwc3@a600000 { Loading
drivers/usb/dwc3/dwc3-msm.c +61 −18 Original line number Original line Diff line number Diff line Loading @@ -2113,6 +2113,60 @@ static void configure_nonpdc_usb_interrupt(struct dwc3_msm *mdwc, } } } } enum bus_vote { BUS_VOTE_INVALID, BUS_VOTE_SUSPEND, BUS_VOTE_NOMINAL, BUS_VOTE_SVS }; static int dwc3_msm_update_bus_bw(struct dwc3_msm *mdwc, enum bus_vote bv) { int ret = 0; struct dwc3 *dwc = platform_get_drvdata(mdwc->dwc3); if (!mdwc->bus_perf_client) return 0; dbg_event(0xFF, "bus_vote_start", bv); switch (bv) { case BUS_VOTE_SVS: /* On some platforms SVS does not have separate vote. Vote for * nominal if svs usecase does not exist */ if (mdwc->bus_scale_table->num_usecases == 2) goto nominal_vote; /* index starts from zero */ ret = msm_bus_scale_client_update_request( mdwc->bus_perf_client, 2); if (ret) dev_err(mdwc->dev, "bus bw voting failed %d\n", ret); break; case BUS_VOTE_NOMINAL: nominal_vote: ret = msm_bus_scale_client_update_request( mdwc->bus_perf_client, 1); if (ret) dev_err(mdwc->dev, "bus bw voting failed %d\n", ret); break; case BUS_VOTE_SUSPEND: ret = msm_bus_scale_client_update_request( mdwc->bus_perf_client, 0); if (ret) dev_err(mdwc->dev, "bus bw voting failed %d\n", ret); break; default: dev_err(mdwc->dev, "Unsupported bus vote:%d\n", bv); ret = -EINVAL; } dbg_event(0xFF, "bus_vote_end", bv); return ret; } static int dwc3_msm_suspend(struct dwc3_msm *mdwc) static int dwc3_msm_suspend(struct dwc3_msm *mdwc) { { int ret; int ret; Loading Loading @@ -2244,15 +2298,7 @@ static int dwc3_msm_suspend(struct dwc3_msm *mdwc) } } } } /* Remove bus voting */ dwc3_msm_update_bus_bw(mdwc, BUS_VOTE_SUSPEND); if (mdwc->bus_perf_client) { dbg_event(0xFF, "bus_devote_start", 0); ret = msm_bus_scale_client_update_request( mdwc->bus_perf_client, 0); dbg_event(0xFF, "bus_devote_finish", 0); if (ret) dev_err(mdwc->dev, "bus bw unvoting failed %d\n", ret); } /* /* * release wakeup source with timeout to defer system suspend to * release wakeup source with timeout to defer system suspend to Loading Loading @@ -2310,15 +2356,10 @@ static int dwc3_msm_resume(struct dwc3_msm *mdwc) pm_stay_awake(mdwc->dev); pm_stay_awake(mdwc->dev); /* Enable bus voting */ if (mdwc->in_host_mode && mdwc->max_rh_port_speed == USB_SPEED_HIGH) if (mdwc->bus_perf_client) { dwc3_msm_update_bus_bw(mdwc, BUS_VOTE_SVS); dbg_event(0xFF, "bus_vote_start", 1); else ret = msm_bus_scale_client_update_request( dwc3_msm_update_bus_bw(mdwc, BUS_VOTE_NOMINAL); mdwc->bus_perf_client, 1); dbg_event(0xFF, "bus_vote_finish", 1); if (ret) dev_err(mdwc->dev, "bus bw voting failed %d\n", ret); } /* Vote for TCXO while waking up USB HSPHY */ /* Vote for TCXO while waking up USB HSPHY */ ret = clk_prepare_enable(mdwc->xo_clk); ret = clk_prepare_enable(mdwc->xo_clk); Loading Loading @@ -3503,6 +3544,7 @@ static int dwc3_msm_host_notifier(struct notifier_block *nb, "set hs core clk rate %ld\n", "set hs core clk rate %ld\n", mdwc->core_clk_rate_hs); mdwc->core_clk_rate_hs); mdwc->max_rh_port_speed = USB_SPEED_HIGH; mdwc->max_rh_port_speed = USB_SPEED_HIGH; dwc3_msm_update_bus_bw(mdwc, BUS_VOTE_SVS); } else { } else { mdwc->max_rh_port_speed = USB_SPEED_SUPER; mdwc->max_rh_port_speed = USB_SPEED_SUPER; } } Loading @@ -3512,6 +3554,7 @@ static int dwc3_msm_host_notifier(struct notifier_block *nb, dev_dbg(mdwc->dev, "set core clk rate %ld\n", dev_dbg(mdwc->dev, "set core clk rate %ld\n", mdwc->core_clk_rate); mdwc->core_clk_rate); mdwc->max_rh_port_speed = USB_SPEED_UNKNOWN; mdwc->max_rh_port_speed = USB_SPEED_UNKNOWN; dwc3_msm_update_bus_bw(mdwc, BUS_VOTE_NOMINAL); } } } } Loading