Merge "ARM: dts: msm: Add usb master clock rate in high speed mode for msm8998"
This commit is contained in:
commit
f28e77a781
3 changed files with 55 additions and 2 deletions
|
@ -19,6 +19,7 @@ Required properties :
|
||||||
and reset lines used by this controller.
|
and reset lines used by this controller.
|
||||||
- reset-names: reset signal name strings sorted in the same order as the resets
|
- reset-names: reset signal name strings sorted in the same order as the resets
|
||||||
property.
|
property.
|
||||||
|
- qcom,core-clk-rate: clock frequency to be set for USB master clock.
|
||||||
|
|
||||||
Optional properties :
|
Optional properties :
|
||||||
- reg: Additional registers
|
- reg: Additional registers
|
||||||
|
@ -54,7 +55,8 @@ Optional properties :
|
||||||
- qcom,disable-dev-mode-pm: If present, it disables PM runtime functionality for device mode.
|
- qcom,disable-dev-mode-pm: If present, it disables PM runtime functionality for device mode.
|
||||||
- qcom,disable-host-mode-pm: If present, it disables XHCI PM runtime functionality when USB
|
- qcom,disable-host-mode-pm: If present, it disables XHCI PM runtime functionality when USB
|
||||||
host mode is used.
|
host mode is used.
|
||||||
- qcom,core-clk-rate: If present, indicates clock frequency to be set for USB master clock.
|
- qcom,core-clk-rate-hs: If present, indicates min core clock frequency required to support
|
||||||
|
hs speed.
|
||||||
- extcon: phandles to external connector devices. First phandle should point to
|
- extcon: phandles to external connector devices. First phandle should point to
|
||||||
external connector, which provide "USB" cable events, the second
|
external connector, which provide "USB" cable events, the second
|
||||||
should point to external connector device, which provide "USB-HOST"
|
should point to external connector device, which provide "USB-HOST"
|
||||||
|
|
|
@ -1739,6 +1739,7 @@
|
||||||
"utmi_clk", "sleep_clk", "xo";
|
"utmi_clk", "sleep_clk", "xo";
|
||||||
|
|
||||||
qcom,core-clk-rate = <120000000>;
|
qcom,core-clk-rate = <120000000>;
|
||||||
|
qcom,core-clk-rate-hs = <60000000>;
|
||||||
|
|
||||||
resets = <&clock_gcc USB_30_BCR>;
|
resets = <&clock_gcc USB_30_BCR>;
|
||||||
reset-names = "core_reset";
|
reset-names = "core_reset";
|
||||||
|
|
|
@ -156,6 +156,7 @@ struct dwc3_msm {
|
||||||
struct clk *xo_clk;
|
struct clk *xo_clk;
|
||||||
struct clk *core_clk;
|
struct clk *core_clk;
|
||||||
long core_clk_rate;
|
long core_clk_rate;
|
||||||
|
long core_clk_rate_hs;
|
||||||
struct clk *iface_clk;
|
struct clk *iface_clk;
|
||||||
struct clk *sleep_clk;
|
struct clk *sleep_clk;
|
||||||
struct clk *utmi_clk;
|
struct clk *utmi_clk;
|
||||||
|
@ -195,6 +196,7 @@ struct dwc3_msm {
|
||||||
struct power_supply *usb_psy;
|
struct power_supply *usb_psy;
|
||||||
struct work_struct vbus_draw_work;
|
struct work_struct vbus_draw_work;
|
||||||
bool in_host_mode;
|
bool in_host_mode;
|
||||||
|
enum usb_device_speed max_rh_port_speed;
|
||||||
unsigned int tx_fifo_size;
|
unsigned int tx_fifo_size;
|
||||||
bool vbus_active;
|
bool vbus_active;
|
||||||
bool suspend;
|
bool suspend;
|
||||||
|
@ -342,6 +344,23 @@ static inline void dwc3_msm_write_readback(void *base, u32 offset,
|
||||||
__func__, val, offset);
|
__func__, val, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool dwc3_msm_is_ss_rhport_connected(struct dwc3_msm *mdwc)
|
||||||
|
{
|
||||||
|
int i, num_ports;
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
reg = dwc3_msm_read_reg(mdwc->base, USB3_HCSPARAMS1);
|
||||||
|
num_ports = HCS_MAX_PORTS(reg);
|
||||||
|
|
||||||
|
for (i = 0; i < num_ports; i++) {
|
||||||
|
reg = dwc3_msm_read_reg(mdwc->base, USB3_PORTSC + i*0x10);
|
||||||
|
if ((reg & PORT_CONNECT) && DEV_SUPERSPEED(reg))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static bool dwc3_msm_is_host_superspeed(struct dwc3_msm *mdwc)
|
static bool dwc3_msm_is_host_superspeed(struct dwc3_msm *mdwc)
|
||||||
{
|
{
|
||||||
int i, num_ports;
|
int i, num_ports;
|
||||||
|
@ -2128,6 +2147,7 @@ static int dwc3_msm_suspend(struct dwc3_msm *mdwc)
|
||||||
static int dwc3_msm_resume(struct dwc3_msm *mdwc)
|
static int dwc3_msm_resume(struct dwc3_msm *mdwc)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
long core_clk_rate;
|
||||||
struct dwc3 *dwc = platform_get_drvdata(mdwc->dwc3);
|
struct dwc3 *dwc = platform_get_drvdata(mdwc->dwc3);
|
||||||
|
|
||||||
dev_dbg(mdwc->dev, "%s: exiting lpm\n", __func__);
|
dev_dbg(mdwc->dev, "%s: exiting lpm\n", __func__);
|
||||||
|
@ -2175,7 +2195,15 @@ static int dwc3_msm_resume(struct dwc3_msm *mdwc)
|
||||||
clk_prepare_enable(mdwc->iface_clk);
|
clk_prepare_enable(mdwc->iface_clk);
|
||||||
if (mdwc->noc_aggr_clk)
|
if (mdwc->noc_aggr_clk)
|
||||||
clk_prepare_enable(mdwc->noc_aggr_clk);
|
clk_prepare_enable(mdwc->noc_aggr_clk);
|
||||||
clk_set_rate(mdwc->core_clk, mdwc->core_clk_rate);
|
|
||||||
|
core_clk_rate = mdwc->core_clk_rate;
|
||||||
|
if (mdwc->in_host_mode && mdwc->max_rh_port_speed == USB_SPEED_HIGH) {
|
||||||
|
core_clk_rate = mdwc->core_clk_rate_hs;
|
||||||
|
dev_dbg(mdwc->dev, "%s: set hs core clk rate %ld\n", __func__,
|
||||||
|
core_clk_rate);
|
||||||
|
}
|
||||||
|
|
||||||
|
clk_set_rate(mdwc->core_clk, core_clk_rate);
|
||||||
clk_prepare_enable(mdwc->core_clk);
|
clk_prepare_enable(mdwc->core_clk);
|
||||||
|
|
||||||
/* set Memory core: ON, Memory periphery: ON */
|
/* set Memory core: ON, Memory periphery: ON */
|
||||||
|
@ -2496,6 +2524,11 @@ static int dwc3_msm_get_clk_gdsc(struct dwc3_msm *mdwc)
|
||||||
if (ret)
|
if (ret)
|
||||||
dev_err(mdwc->dev, "fail to set core_clk freq:%d\n", ret);
|
dev_err(mdwc->dev, "fail to set core_clk freq:%d\n", ret);
|
||||||
|
|
||||||
|
if (of_property_read_u32(mdwc->dev->of_node, "qcom,core-clk-rate-hs",
|
||||||
|
(u32 *)&mdwc->core_clk_rate_hs)) {
|
||||||
|
dev_dbg(mdwc->dev, "USB core-clk-rate-hs is not present\n");
|
||||||
|
mdwc->core_clk_rate_hs = mdwc->core_clk_rate;
|
||||||
|
}
|
||||||
|
|
||||||
mdwc->core_reset = devm_reset_control_get(mdwc->dev, "core_reset");
|
mdwc->core_reset = devm_reset_control_get(mdwc->dev, "core_reset");
|
||||||
if (IS_ERR(mdwc->core_reset)) {
|
if (IS_ERR(mdwc->core_reset)) {
|
||||||
|
@ -3179,10 +3212,26 @@ static int dwc3_msm_host_notifier(struct notifier_block *nb,
|
||||||
if (udev->parent && !udev->parent->parent &&
|
if (udev->parent && !udev->parent->parent &&
|
||||||
udev->dev.parent->parent == &dwc->xhci->dev) {
|
udev->dev.parent->parent == &dwc->xhci->dev) {
|
||||||
if (event == USB_DEVICE_ADD && udev->actconfig) {
|
if (event == USB_DEVICE_ADD && udev->actconfig) {
|
||||||
|
if (!dwc3_msm_is_ss_rhport_connected(mdwc)) {
|
||||||
|
/*
|
||||||
|
* Core clock rate can be reduced only if root
|
||||||
|
* hub SS port is not enabled/connected.
|
||||||
|
*/
|
||||||
|
clk_set_rate(mdwc->core_clk,
|
||||||
|
mdwc->core_clk_rate_hs);
|
||||||
|
dev_dbg(mdwc->dev,
|
||||||
|
"set hs core clk rate %ld\n",
|
||||||
|
mdwc->core_clk_rate_hs);
|
||||||
|
mdwc->max_rh_port_speed = USB_SPEED_HIGH;
|
||||||
|
} else {
|
||||||
|
mdwc->max_rh_port_speed = USB_SPEED_SUPER;
|
||||||
|
}
|
||||||
|
|
||||||
if (udev->speed >= USB_SPEED_SUPER)
|
if (udev->speed >= USB_SPEED_SUPER)
|
||||||
max_power = udev->actconfig->desc.bMaxPower * 8;
|
max_power = udev->actconfig->desc.bMaxPower * 8;
|
||||||
else
|
else
|
||||||
max_power = udev->actconfig->desc.bMaxPower * 2;
|
max_power = udev->actconfig->desc.bMaxPower * 2;
|
||||||
|
|
||||||
dev_dbg(mdwc->dev, "%s configured bMaxPower:%d (mA)\n",
|
dev_dbg(mdwc->dev, "%s configured bMaxPower:%d (mA)\n",
|
||||||
dev_name(&udev->dev), max_power);
|
dev_name(&udev->dev), max_power);
|
||||||
|
|
||||||
|
@ -3194,6 +3243,7 @@ static int dwc3_msm_host_notifier(struct notifier_block *nb,
|
||||||
pval.intval = 0;
|
pval.intval = 0;
|
||||||
power_supply_set_property(mdwc->usb_psy,
|
power_supply_set_property(mdwc->usb_psy,
|
||||||
POWER_SUPPLY_PROP_BOOST_CURRENT, &pval);
|
POWER_SUPPLY_PROP_BOOST_CURRENT, &pval);
|
||||||
|
mdwc->max_rh_port_speed = USB_SPEED_UNKNOWN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue