net: ethernet: ti: cpts: move dt props parsing to cpts driver
authorGrygorii Strashko <grygorii.strashko@ti.com>
Wed, 7 Dec 2016 00:00:42 +0000 (18:00 -0600)
committerDavid S. Miller <davem@davemloft.net>
Wed, 7 Dec 2016 16:13:48 +0000 (11:13 -0500)
Move DT properties parsing into CPTS driver to simplify CPSW
code and CPTS driver porting on other SoC in the future
(like Keystone 2) - with this change it will not be required
to add the same DT parsing code in Keystone 2 NETCP driver.

Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ti/cpsw.c
drivers/net/ethernet/ti/cpsw.h
drivers/net/ethernet/ti/cpts.c
drivers/net/ethernet/ti/cpts.h

index a9a8354202814a140b5ae9651dbc4d3ae53c2637..b62d958c5faed7e3bf3b7f0ffc097a963936cb0e 100644 (file)
@@ -2524,18 +2524,6 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data,
        }
        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);
@@ -2990,9 +2978,7 @@ static int cpsw_probe(struct platform_device *pdev)
                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;
index 16b54c6f32c2e32a48f24ee2c7b582623d0caa18..6c3037aa2cd304a982ec0871d702567e589f53d3 100644 (file)
@@ -31,8 +31,6 @@ struct cpsw_platform_data {
        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 */
index 31cd83fa10cec9fa8591b7b90116290070a353cd..cb844ed6dcdd733ee24a854c8f51e71cbc3c5e56 100644 (file)
@@ -405,10 +405,31 @@ void cpts_unregister(struct cpts *cpts)
 }
 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)
@@ -419,6 +440,10 @@ struct cpts *cpts_create(struct device *dev, void __iomem *regs,
        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");
@@ -429,9 +454,10 @@ struct cpts *cpts_create(struct device *dev, void __iomem *regs,
 
        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;
index e7d857c24891afc687222c65ff3a5bdabc5dc2f2..5da23af7a9a60b74d344a1fd190daf90df461246 100644 (file)
@@ -27,6 +27,7 @@
 #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>
@@ -133,7 +134,7 @@ void cpts_tx_timestamp(struct cpts *cpts, struct sk_buff *skb);
 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)
@@ -168,7 +169,7 @@ static inline void cpts_tx_timestamp(struct cpts *cpts, struct sk_buff *skb)
 
 static inline
 struct cpts *cpts_create(struct device *dev, void __iomem *regs,
-                        u32 mult, u32 shift)
+                        struct device_node *node)
 {
        return NULL;
 }