diff options
-rw-r--r-- | drivers/irqchip/irq-imx-irqsteer.c | 2 | ||||
-rw-r--r-- | drivers/usb/dwc3/core.c | 24 |
2 files changed, 19 insertions, 7 deletions
diff --git a/drivers/irqchip/irq-imx-irqsteer.c b/drivers/irqchip/irq-imx-irqsteer.c index f9a19995c14a..e43206f29938 100644 --- a/drivers/irqchip/irq-imx-irqsteer.c +++ b/drivers/irqchip/irq-imx-irqsteer.c @@ -208,7 +208,7 @@ static int imx_irqsteer_chans_enable(struct irqsteer_data *data) { int ret; - ret = clk_prepare_enable(irqsteer_data->ipg_clk); + ret = clk_prepare_enable(data->ipg_clk); if (ret) { dev_err(data->dev, "failed to enable ipg clk: %d\n", ret); return ret; diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index c626a70c3e75..d27c5c4eb709 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -1043,16 +1043,27 @@ static void dwc3_set_power_down_clk_scale(struct dwc3 *dwc) * The power down scale field specifies how many suspend_clk * periods fit into a 16KHz clock period. When performing * the division, round up the remainder. + * + * The power down scale value is calculated using the fastest + * frequency of the suspend_clk. If it isn't fixed (but within + * the accuracy requirement), the driver may not know the max + * rate of the suspend_clk, so only update the power down scale + * if the default is less than the calculated value from + * clk_get_rate() or if the default is questionably high + * (3x or more) to be within the requirement. */ suspend_clk = of_clk_get_by_name(node, "suspend"); if (IS_ERR(suspend_clk)) return; - scale = DIV_ROUND_UP(clk_get_rate(suspend_clk), 16384); + scale = DIV_ROUND_UP(clk_get_rate(suspend_clk), 16000); reg = dwc3_readl(dwc->regs, DWC3_GCTL); - reg &= ~(DWC3_GCTL_PWRDNSCALE_MASK); - reg |= DWC3_GCTL_PWRDNSCALE(scale); - dwc3_writel(dwc->regs, DWC3_GCTL, reg); + if ((reg & DWC3_GCTL_PWRDNSCALE_MASK) < DWC3_GCTL_PWRDNSCALE(scale) || + (reg & DWC3_GCTL_PWRDNSCALE_MASK) > DWC3_GCTL_PWRDNSCALE(scale * 3)) { + reg &= ~(DWC3_GCTL_PWRDNSCALE_MASK); + reg |= DWC3_GCTL_PWRDNSCALE(scale); + dwc3_writel(dwc->regs, DWC3_GCTL, reg); + } } #ifdef CONFIG_OF @@ -1122,8 +1133,6 @@ static int dwc3_core_init(struct dwc3 *dwc) */ dwc3_writel(dwc->regs, DWC3_GUID, LINUX_VERSION_CODE); - dwc3_set_power_down_clk_scale(dwc); - ret = dwc3_phy_setup(dwc); if (ret) goto err0; @@ -1170,6 +1179,9 @@ static int dwc3_core_init(struct dwc3 *dwc) if (ret) goto err1; + /* Set power down scale of suspend_clk */ + dwc3_set_power_down_clk_scale(dwc); + /* Adjust Frame Length */ dwc3_frame_length_adjustment(dwc); |