#include <linux/acpi.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/reset.h>
+#include <linux/bitfield.h>
 
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
        }
 }
 
+/**
+ * dwc3_ref_clk_period - Reference clock period configuration
+ *             Default reference clock period depends on hardware
+ *             configuration. For systems with reference clock that differs
+ *             from the default, this will set clock period in DWC3_GUCTL
+ *             register.
+ * @dwc: Pointer to our controller context structure
+ * @ref_clk_per: reference clock period in ns
+ */
+static void dwc3_ref_clk_period(struct dwc3 *dwc)
+{
+       u32 reg;
+
+       if (dwc->ref_clk_per == 0)
+               return;
+
+       reg = dwc3_readl(dwc->regs, DWC3_GUCTL);
+       reg &= ~DWC3_GUCTL_REFCLKPER_MASK;
+       reg |=  FIELD_PREP(DWC3_GUCTL_REFCLKPER_MASK, dwc->ref_clk_per);
+       dwc3_writel(dwc->regs, DWC3_GUCTL, reg);
+}
+
+
 /**
  * dwc3_free_one_event_buffer - Frees one event buffer
  * @dwc: Pointer to our controller context structure
        /* Adjust Frame Length */
        dwc3_frame_length_adjustment(dwc);
 
+       /* Adjust Reference Clock Period */
+       dwc3_ref_clk_period(dwc);
+
        dwc3_set_incr_burst_type(dwc);
 
        usb_phy_set_suspend(dwc->usb2_phy, 0);
                                    &dwc->hsphy_interface);
        device_property_read_u32(dev, "snps,quirk-frame-length-adjustment",
                                 &dwc->fladj);
+       device_property_read_u32(dev, "snps,ref-clock-period-ns",
+                                &dwc->ref_clk_per);
 
        dwc->dis_metastability_quirk = device_property_read_bool(dev,
                                "snps,dis_metastability_quirk");
 
 #define DWC3_GFLADJ_30MHZ_SDBND_SEL            BIT(7)
 #define DWC3_GFLADJ_30MHZ_MASK                 0x3f
 
+/* Global User Control Register*/
+#define DWC3_GUCTL_REFCLKPER_MASK              0xffc00000
+#define DWC3_GUCTL_REFCLKPER_SEL               22
+
 /* Global User Control Register 2 */
 #define DWC3_GUCTL2_RST_ACTBITLATER            BIT(14)
 
  * @regs: base address for our registers
  * @regs_size: address space size
  * @fladj: frame length adjustment
+ * @ref_clk_per: reference clock period configuration
  * @irq_gadget: peripheral controller's IRQ number
  * @otg_irq: IRQ number for OTG IRQs
  * @current_otg_role: current role of operation while using the OTG block
        struct power_supply     *usb_psy;
 
        u32                     fladj;
+       u32                     ref_clk_per;
        u32                     irq_gadget;
        u32                     otg_irq;
        u32                     current_otg_role;