}
        data->active_slave = prop;
 
-       if (of_property_read_u32(node, "cpts_clock_mult", &prop)) {
-               dev_err(&pdev->dev, "Missing cpts_clock_mult property in the DT.\n");
-               return -EINVAL;
-       }
-       data->cpts_clock_mult = prop;
-
-       if (of_property_read_u32(node, "cpts_clock_shift", &prop)) {
-               dev_err(&pdev->dev, "Missing cpts_clock_shift property in the DT.\n");
-               return -EINVAL;
-       }
-       data->cpts_clock_shift = prop;
-
        data->slave_data = devm_kzalloc(&pdev->dev, data->slaves
                                        * sizeof(struct cpsw_slave_data),
                                        GFP_KERNEL);
                goto clean_dma_ret;
        }
 
-       cpsw->cpts = cpts_create(cpsw->dev, cpts_regs,
-                                cpsw->data.cpts_clock_mult,
-                                cpsw->data.cpts_clock_shift);
+       cpsw->cpts = cpts_create(cpsw->dev, cpts_regs, cpsw->dev->of_node);
        if (IS_ERR(cpsw->cpts)) {
                ret = PTR_ERR(cpsw->cpts);
                goto clean_ale_ret;
 
        u32     channels;       /* number of cpdma channels (symmetric) */
        u32     slaves;         /* number of slave cpgmac ports */
        u32     active_slave; /* time stamping, ethtool and SIOCGMIIPHY slave */
-       u32     cpts_clock_mult;  /* convert input clock ticks to nanoseconds */
-       u32     cpts_clock_shift; /* convert input clock ticks to nanoseconds */
        u32     ale_entries;    /* ale table size */
        u32     bd_ram_size;  /*buffer descriptor ram size */
        u32     mac_control;    /* Mac control register */
 
 }
 EXPORT_SYMBOL_GPL(cpts_unregister);
 
+static int cpts_of_parse(struct cpts *cpts, struct device_node *node)
+{
+       int ret = -EINVAL;
+       u32 prop;
+
+       if (of_property_read_u32(node, "cpts_clock_mult", &prop))
+               goto  of_error;
+       cpts->cc.mult = prop;
+
+       if (of_property_read_u32(node, "cpts_clock_shift", &prop))
+               goto  of_error;
+       cpts->cc.shift = prop;
+
+       return 0;
+
+of_error:
+       dev_err(cpts->dev, "CPTS: Missing property in the DT.\n");
+       return ret;
+}
+
 struct cpts *cpts_create(struct device *dev, void __iomem *regs,
-                        u32 mult, u32 shift)
+                        struct device_node *node)
 {
        struct cpts *cpts;
+       int ret;
 
        cpts = devm_kzalloc(dev, sizeof(*cpts), GFP_KERNEL);
        if (!cpts)
        spin_lock_init(&cpts->lock);
        INIT_DELAYED_WORK(&cpts->overflow_work, cpts_overflow_check);
 
+       ret = cpts_of_parse(cpts, node);
+       if (ret)
+               return ERR_PTR(ret);
+
        cpts->refclk = devm_clk_get(dev, "cpts");
        if (IS_ERR(cpts->refclk)) {
                dev_err(dev, "Failed to get cpts refclk\n");
 
        cpts->cc.read = cpts_systim_read;
        cpts->cc.mask = CLOCKSOURCE_MASK(32);
-       cpts->cc.shift = shift;
-       cpts->cc_mult = mult;
-       cpts->cc.mult = mult;
+       /* save cc.mult original value as it can be modified
+        * by cpts_ptp_adjfreq().
+        */
+       cpts->cc_mult = cpts->cc.mult;
        cpts->info = cpts_info;
 
        return cpts;
 
 #include <linux/clocksource.h>
 #include <linux/device.h>
 #include <linux/list.h>
+#include <linux/of.h>
 #include <linux/ptp_clock_kernel.h>
 #include <linux/skbuff.h>
 #include <linux/timecounter.h>
 int cpts_register(struct cpts *cpts);
 void cpts_unregister(struct cpts *cpts);
 struct cpts *cpts_create(struct device *dev, void __iomem *regs,
-                        u32 mult, u32 shift);
+                        struct device_node *node);
 void cpts_release(struct cpts *cpts);
 
 static inline void cpts_rx_enable(struct cpts *cpts, int enable)
 
 static inline
 struct cpts *cpts_create(struct device *dev, void __iomem *regs,
-                        u32 mult, u32 shift)
+                        struct device_node *node)
 {
        return NULL;
 }