Message ID | 20220127200636.1456175-4-sean.anderson@seco.com |
---|---|
State | New |
Headers | show |
Series | usb: dwc3: Calculate REFCLKPER et. al. from reference clock | expand |
Sean Anderson wrote: > Instead of using a special property to determine the reference clock > period, use the rate of the reference clock. When we have a legacy > snps,ref-clock-period-ns property and no reference clock, use it > instead. Fractional clocks are not currently supported, and will be > dealt with in the next commit. > > Signed-off-by: Sean Anderson <sean.anderson@seco.com> > Reviewed-by: Robert Hancock <robert.hancock@calian.com> > Tested-by: Robert Hancock <robert.hancock@calian.com> > --- > > Changes in v3: > - Define each variable on its own line > > drivers/usb/dwc3/core.c | 14 ++++++++++++-- > 1 file changed, 12 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c > index 699ab9abdc47..38fef5c74359 100644 > --- a/drivers/usb/dwc3/core.c > +++ b/drivers/usb/dwc3/core.c > @@ -347,14 +347,24 @@ static void dwc3_frame_length_adjustment(struct dwc3 *dwc) > */ > static void dwc3_ref_clk_period(struct dwc3 *dwc) > { > + unsigned long period; > + unsigned long rate; > u32 reg; > > - if (dwc->ref_clk_per == 0) > + if (dwc->ref_clk) { > + rate = clk_get_rate(dwc->ref_clk); > + if (!rate) > + return; > + period = NSEC_PER_SEC / rate; > + } else if (dwc->ref_clk_per) { > + period = dwc->ref_clk_per; > + } else { > return; > + } > > reg = dwc3_readl(dwc->regs, DWC3_GUCTL); > reg &= ~DWC3_GUCTL_REFCLKPER_MASK; > - reg |= FIELD_PREP(DWC3_GUCTL_REFCLKPER_MASK, dwc->ref_clk_per); > + reg |= FIELD_PREP(DWC3_GUCTL_REFCLKPER_MASK, period); > dwc3_writel(dwc->regs, DWC3_GUCTL, reg); > } > Reviewed-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com> Thanks, Thinh
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 699ab9abdc47..38fef5c74359 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -347,14 +347,24 @@ static void dwc3_frame_length_adjustment(struct dwc3 *dwc) */ static void dwc3_ref_clk_period(struct dwc3 *dwc) { + unsigned long period; + unsigned long rate; u32 reg; - if (dwc->ref_clk_per == 0) + if (dwc->ref_clk) { + rate = clk_get_rate(dwc->ref_clk); + if (!rate) + return; + period = NSEC_PER_SEC / rate; + } else if (dwc->ref_clk_per) { + period = dwc->ref_clk_per; + } else { return; + } reg = dwc3_readl(dwc->regs, DWC3_GUCTL); reg &= ~DWC3_GUCTL_REFCLKPER_MASK; - reg |= FIELD_PREP(DWC3_GUCTL_REFCLKPER_MASK, dwc->ref_clk_per); + reg |= FIELD_PREP(DWC3_GUCTL_REFCLKPER_MASK, period); dwc3_writel(dwc->regs, DWC3_GUCTL, reg); }