Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1531769 > unrolled thread

[PATCH v2 00/13] net: ethernet: ti: cpts: update and fixes

Started byGrygorii Strashko <grygorii.strashko@ti.com>
First post2016-11-29 00:10 +0100
Last post2016-11-29 10:50 +0100
Articles 10 on this page of 30 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH v2 00/13] net: ethernet: ti: cpts: update and fixes Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
    [PATCH  v2 12/13] net: ethernet: ti: cpts: calc mult and shift from refclk freq Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
      Re: [PATCH  v2 12/13] net: ethernet: ti: cpts: calc mult and shift  from refclk freq Richard Cochran <richardcochran@gmail.com> - 2016-11-29 11:40 +0100
        Re: [PATCH v2 12/13] net: ethernet: ti: cpts: calc mult and shift  from refclk freq Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 17:30 +0100
    [PATCH  v2 03/13] net: ethernet: ti: cpsw: minimize direct access to struct cpts Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
    [PATCH v2 10/13] net: ethernet: ti: cpts: drop excessive writes to CTRL and INT_EN regs Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
      Re: [PATCH v2 10/13] net: ethernet: ti: cpts: drop excessive writes  to CTRL and INT_EN regs Richard Cochran <richardcochran@gmail.com> - 2016-11-29 11:20 +0100
    [PATCH  v2 06/13] net: ethernet: ti: cpts: disable cpts when unregistered Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
      Re: [PATCH  v2 06/13] net: ethernet: ti: cpts: disable cpts when  unregistered Richard Cochran <richardcochran@gmail.com> - 2016-11-29 11:00 +0100
    [PATCH  v2 07/13] net: ethernet: ti: cpts: rework initialization/deinitialization Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
      Re: [PATCH  v2 07/13] net: ethernet: ti: cpts: rework  initialization/deinitialization Richard Cochran <richardcochran@gmail.com> - 2016-11-29 11:10 +0100
        Re: [PATCH v2 07/13] net: ethernet: ti: cpts: rework  initialization/deinitialization Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 17:00 +0100
          Re: [PATCH v2 07/13] net: ethernet: ti: cpts: rework  initialization/deinitialization Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-30 19:40 +0100
    [PATCH  v2 02/13] net: ethernet: ti: allow cpts to be built separately Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
      Re: [PATCH  v2 02/13] net: ethernet: ti: allow cpts to be built  separately Richard Cochran <richardcochran@gmail.com> - 2016-11-29 10:40 +0100
    [PATCH  v2 01/13] net: ethernet: ti: cpts: switch to readl/writel_relaxed() Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
      Re: [PATCH  v2 01/13] net: ethernet: ti: cpts: switch to  readl/writel_relaxed() Richard Cochran <richardcochran@gmail.com> - 2016-11-29 10:40 +0100
    [PATCH  v2 13/13] net: ethernet: ti: cpts: fix overflow check period Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
      Re: [PATCH  v2 13/13] net: ethernet: ti: cpts: fix overflow check  period Richard Cochran <richardcochran@gmail.com> - 2016-11-30 10:20 +0100
    [PATCH  v2 11/13] clocksource: export the clocks_calc_mult_shift to use by timestamp code Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
      Re: [PATCH v2 11/13] clocksource: export the clocks_calc_mult_shift  to use by timestamp code Thomas Gleixner <tglx@linutronix.de> - 2016-11-29 10:20 +0100
    [PATCH  v2 09/13] net: ethernet: ti: cpts: clean up event list if event pool is empty Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:20 +0100
      Re: [PATCH  v2 09/13] net: ethernet: ti: cpts: clean up event list  if event pool is empty Richard Cochran <richardcochran@gmail.com> - 2016-11-29 11:20 +0100
    [PATCH  v2 04/13] net: ethernet: ti: cpts: fix unbalanced clk api usage in cpts_register/unregister Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:20 +0100
      Re: [PATCH  v2 04/13] net: ethernet: ti: cpts: fix unbalanced clk  api usage in cpts_register/unregister Richard Cochran <richardcochran@gmail.com> - 2016-11-29 10:50 +0100
    [PATCH  v2 08/13] net: ethernet: ti: cpts: move dt props parsing to cpts driver Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:20 +0100
      Re: [PATCH  v2 08/13] net: ethernet: ti: cpts: move dt props parsing  to cpts driver Richard Cochran <richardcochran@gmail.com> - 2016-11-29 11:20 +0100
        Re: [PATCH v2 08/13] net: ethernet: ti: cpts: move dt props parsing  to cpts driver Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 17:00 +0100
    [PATCH  v2 05/13] net: ethernet: ti: cpts: fix registration order Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:20 +0100
      Re: [PATCH  v2 05/13] net: ethernet: ti: cpts: fix registration order Richard Cochran <richardcochran@gmail.com> - 2016-11-29 10:50 +0100

Page 2 of 2 — ← Prev page 1 [2]


#1532025 — Re: [PATCH v2 11/13] clocksource: export the clocks_calc_mult_shift to use by timestamp code

FromThomas Gleixner <tglx@linutronix.de>
Date2016-11-29 10:20 +0100
SubjectRe: [PATCH v2 11/13] clocksource: export the clocks_calc_mult_shift to use by timestamp code
Message-ID<sIMJY-6yn-37@gated-at.bofh.it>
In reply to#1531785
On Mon, 28 Nov 2016, Grygorii Strashko wrote:

> From: Murali Karicheri <m-karicheri2@ti.com>
> 
> The CPSW CPTS driver is capable of doing timestamping on tx/rx packets and
> requires to know mult and shift factors for timestamp conversion from raw
> value to nanoseconds (ptp clock). Now these mult and shift factors are
> calculated manually and provided through DT, which makes very hard to
> support of a lot number of platforms, especially if CPTS refclk is not the
> same for some kind of boards and depends on efuse settings (Keystone 2
> platforms). Hence, export clocks_calc_mult_shift() to allow drivers like
> CPSW CPTS (and other ptp drivesr) to benefit from automaitc calculation of
> mult and shift factors.
> 
> Cc: John Stultz <john.stultz@linaro.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>

Acked-by: Thomas Gleixner <tglx@linutronix.de>

> ---
>  kernel/time/clocksource.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
> index 7e4fad7..150242c 100644
> --- a/kernel/time/clocksource.c
> +++ b/kernel/time/clocksource.c
> @@ -89,6 +89,7 @@ clocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 maxsec)
>  	*mult = tmp;
>  	*shift = sft;
>  }
> +EXPORT_SYMBOL_GPL(clocks_calc_mult_shift);
>  
>  /*[Clocksource internal variables]---------
>   * curr_clocksource:
> -- 
> 2.10.1
> 
> 

[toc] | [prev] | [next] | [standalone]


#1531795 — [PATCH v2 09/13] net: ethernet: ti: cpts: clean up event list if event pool is empty

FromGrygorii Strashko <grygorii.strashko@ti.com>
Date2016-11-29 00:20 +0100
Subject[PATCH v2 09/13] net: ethernet: ti: cpts: clean up event list if event pool is empty
Message-ID<sIDnj-aD-33@gated-at.bofh.it>
In reply to#1531769
From: WingMan Kwok <w-kwok2@ti.com>

When a CPTS user does not exit gracefully by disabling cpts
timestamping and leaving a joined multicast group, the system
continues to receive and timestamps the ptp packets which eventually
occupy all the event list entries.  When this happns, the added code
tries to remove some list entries which are expired.

Signed-off-by: WingMan Kwok <w-kwok2@ti.com>
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
---
 drivers/net/ethernet/ti/cpts.c | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/ti/cpts.c b/drivers/net/ethernet/ti/cpts.c
index e743361..1b766eb 100644
--- a/drivers/net/ethernet/ti/cpts.c
+++ b/drivers/net/ethernet/ti/cpts.c
@@ -57,6 +57,26 @@ static int cpts_fifo_pop(struct cpts *cpts, u32 *high, u32 *low)
 	return -1;
 }
 
+static int cpts_purge_events(struct cpts *cpts)
+{
+	struct list_head *this, *next;
+	struct cpts_event *event;
+	int removed = 0;
+
+	list_for_each_safe(this, next, &cpts->events) {
+		event = list_entry(this, struct cpts_event, list);
+		if (event_expired(event)) {
+			list_del_init(&event->list);
+			list_add(&event->list, &cpts->pool);
+			++removed;
+		}
+	}
+
+	if (removed)
+		dev_dbg(cpts->dev, "cpts: event pool cleaned up %d\n", removed);
+	return removed ? 0 : -1;
+}
+
 /*
  * Returns zero if matching event type was found.
  */
@@ -69,10 +89,12 @@ static int cpts_fifo_read(struct cpts *cpts, int match)
 	for (i = 0; i < CPTS_FIFO_DEPTH; i++) {
 		if (cpts_fifo_pop(cpts, &hi, &lo))
 			break;
-		if (list_empty(&cpts->pool)) {
-			pr_err("cpts: event pool is empty\n");
+
+		if (list_empty(&cpts->pool) && cpts_purge_events(cpts)) {
+			dev_err(cpts->dev, "cpts: event pool empty\n");
 			return -1;
 		}
+
 		event = list_first_entry(&cpts->pool, struct cpts_event, list);
 		event->tmo = jiffies + 2;
 		event->high = hi;
-- 
2.10.1

[toc] | [prev] | [next] | [standalone]


#1532090 — Re: [PATCH v2 09/13] net: ethernet: ti: cpts: clean up event list if event pool is empty

FromRichard Cochran <richardcochran@gmail.com>
Date2016-11-29 11:20 +0100
SubjectRe: [PATCH v2 09/13] net: ethernet: ti: cpts: clean up event list if event pool is empty
Message-ID<sING1-7bs-9@gated-at.bofh.it>
In reply to#1531795
On Mon, Nov 28, 2016 at 05:03:33PM -0600, Grygorii Strashko wrote:
> From: WingMan Kwok <w-kwok2@ti.com>
> 
> When a CPTS user does not exit gracefully by disabling cpts
> timestamping and leaving a joined multicast group, the system
> continues to receive and timestamps the ptp packets which eventually
> occupy all the event list entries.  When this happns, the added code
> tries to remove some list entries which are expired.
> 
> Signed-off-by: WingMan Kwok <w-kwok2@ti.com>
> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>

This patch belongs earlier in the series, before the re-structuring.
It doesn't depend on the others, AFAICT.

Thanks,
Richard

[toc] | [prev] | [next] | [standalone]


#1531797 — [PATCH v2 04/13] net: ethernet: ti: cpts: fix unbalanced clk api usage in cpts_register/unregister

FromGrygorii Strashko <grygorii.strashko@ti.com>
Date2016-11-29 00:20 +0100
Subject[PATCH v2 04/13] net: ethernet: ti: cpts: fix unbalanced clk api usage in cpts_register/unregister
Message-ID<sIDnj-aD-23@gated-at.bofh.it>
In reply to#1531769
There are two issues with TI CPTS code which are reproducible when TI
CPSW ethX device passes few up/down iterations:
- cpts refclk prepare counter continuously incremented after each
up/down iteration;
- devm_clk_get(dev, "cpts") is called many times.

Hence, fix these issues by using clk_disable_unprepare() in
cpts_clk_release() and skipping devm_clk_get() if cpts refclk has been
acquired already.

Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
---
 drivers/net/ethernet/ti/cpts.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/ti/cpts.c b/drivers/net/ethernet/ti/cpts.c
index b26d6fe..101e17b 100644
--- a/drivers/net/ethernet/ti/cpts.c
+++ b/drivers/net/ethernet/ti/cpts.c
@@ -230,18 +230,20 @@ static void cpts_overflow_check(struct work_struct *work)
 
 static void cpts_clk_init(struct device *dev, struct cpts *cpts)
 {
-	cpts->refclk = devm_clk_get(dev, "cpts");
-	if (IS_ERR(cpts->refclk)) {
-		dev_err(dev, "Failed to get cpts refclk\n");
-		cpts->refclk = NULL;
-		return;
+	if (!cpts->refclk) {
+		cpts->refclk = devm_clk_get(dev, "cpts");
+		if (IS_ERR(cpts->refclk)) {
+			dev_err(dev, "Failed to get cpts refclk\n");
+			cpts->refclk = NULL;
+			return;
+		}
 	}
 	clk_prepare_enable(cpts->refclk);
 }
 
 static void cpts_clk_release(struct cpts *cpts)
 {
-	clk_disable(cpts->refclk);
+	clk_disable_unprepare(cpts->refclk);
 }
 
 static int cpts_match(struct sk_buff *skb, unsigned int ptp_class,
-- 
2.10.1

[toc] | [prev] | [next] | [standalone]


#1532053 — Re: [PATCH v2 04/13] net: ethernet: ti: cpts: fix unbalanced clk api usage in cpts_register/unregister

FromRichard Cochran <richardcochran@gmail.com>
Date2016-11-29 10:50 +0100
SubjectRe: [PATCH v2 04/13] net: ethernet: ti: cpts: fix unbalanced clk api usage in cpts_register/unregister
Message-ID<sINcZ-6J1-5@gated-at.bofh.it>
In reply to#1531797
On Mon, Nov 28, 2016 at 05:03:28PM -0600, Grygorii Strashko wrote:
> There are two issues with TI CPTS code which are reproducible when TI
> CPSW ethX device passes few up/down iterations:
> - cpts refclk prepare counter continuously incremented after each
> up/down iteration;
> - devm_clk_get(dev, "cpts") is called many times.
> 
> Hence, fix these issues by using clk_disable_unprepare() in
> cpts_clk_release() and skipping devm_clk_get() if cpts refclk has been
> acquired already.
> 
> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>

Acked-by: Richard Cochran <richardcochran@gmail.com>

[toc] | [prev] | [next] | [standalone]


#1531798 — [PATCH v2 08/13] net: ethernet: ti: cpts: move dt props parsing to cpts driver

FromGrygorii Strashko <grygorii.strashko@ti.com>
Date2016-11-29 00:20 +0100
Subject[PATCH v2 08/13] net: ethernet: ti: cpts: move dt props parsing to cpts driver
Message-ID<sIDnj-aD-27@gated-at.bofh.it>
In reply to#1531769
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>
---
 drivers/net/ethernet/ti/cpsw.c | 16 +---------------
 drivers/net/ethernet/ti/cpsw.h |  2 --
 drivers/net/ethernet/ti/cpts.c | 29 ++++++++++++++++++++++++++---
 drivers/net/ethernet/ti/cpts.h |  5 +++--
 4 files changed, 30 insertions(+), 22 deletions(-)

diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index 6c28ef1..ae1ec6a 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -2312,18 +2312,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);
@@ -2789,9 +2777,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;
diff --git a/drivers/net/ethernet/ti/cpsw.h b/drivers/net/ethernet/ti/cpsw.h
index 16b54c6..6c3037a 100644
--- a/drivers/net/ethernet/ti/cpsw.h
+++ b/drivers/net/ethernet/ti/cpsw.h
@@ -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 */
diff --git a/drivers/net/ethernet/ti/cpts.c b/drivers/net/ethernet/ti/cpts.c
index ec3f702..e743361 100644
--- a/drivers/net/ethernet/ti/cpts.c
+++ b/drivers/net/ethernet/ti/cpts.c
@@ -386,10 +386,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;
 
 	if (!regs || !dev)
 		return ERR_PTR(-EINVAL);
@@ -403,6 +424,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");
@@ -413,8 +438,6 @@ 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->info = cpts_info;
 
 	return cpts;
diff --git a/drivers/net/ethernet/ti/cpts.h b/drivers/net/ethernet/ti/cpts.h
index e7d857c..5da23af 100644
--- a/drivers/net/ethernet/ti/cpts.h
+++ b/drivers/net/ethernet/ti/cpts.h
@@ -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;
 }
-- 
2.10.1

[toc] | [prev] | [next] | [standalone]


#1532102 — Re: [PATCH v2 08/13] net: ethernet: ti: cpts: move dt props parsing to cpts driver

FromRichard Cochran <richardcochran@gmail.com>
Date2016-11-29 11:20 +0100
SubjectRe: [PATCH v2 08/13] net: ethernet: ti: cpts: move dt props parsing to cpts driver
Message-ID<sING2-7bs-35@gated-at.bofh.it>
In reply to#1531798
On Mon, Nov 28, 2016 at 05:03:32PM -0600, Grygorii Strashko wrote:
> +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;

Why not set cc.mult here at the same time?

> +
> +	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;
> +}

Thanks,
Richard

[toc] | [prev] | [next] | [standalone]


#1532447 — Re: [PATCH v2 08/13] net: ethernet: ti: cpts: move dt props parsing to cpts driver

FromGrygorii Strashko <grygorii.strashko@ti.com>
Date2016-11-29 17:00 +0100
SubjectRe: [PATCH v2 08/13] net: ethernet: ti: cpts: move dt props parsing to cpts driver
Message-ID<sISZ4-1UF-23@gated-at.bofh.it>
In reply to#1532102

On 11/29/2016 04:11 AM, Richard Cochran wrote:
> On Mon, Nov 28, 2016 at 05:03:32PM -0600, Grygorii Strashko wrote:
>> +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;
> 
> Why not set cc.mult here at the same time?

The same reason as in prev patch - cpts->cc_mult is original/initial mult
value loaded from DT (or calculated), while cc.mult is dynamic value
which can be changed as part of freq adjustment.

> 
>> +
>> +	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;
>> +}
> 


-- 
regards,
-grygorii

[toc] | [prev] | [next] | [standalone]


#1531801 — [PATCH v2 05/13] net: ethernet: ti: cpts: fix registration order

FromGrygorii Strashko <grygorii.strashko@ti.com>
Date2016-11-29 00:20 +0100
Subject[PATCH v2 05/13] net: ethernet: ti: cpts: fix registration order
Message-ID<sIDnj-aD-29@gated-at.bofh.it>
In reply to#1531769
The ptp clock registered before spinlock, which is protecting it, and
before timecounter and cyclecounter initialization in cpts_register().

So, ensure that ptp clock is registered the last, after everything
else is done.

Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
---
 drivers/net/ethernet/ti/cpts.c | 24 ++++++++++++++----------
 1 file changed, 14 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/ti/cpts.c b/drivers/net/ethernet/ti/cpts.c
index 101e17b..cb851a7 100644
--- a/drivers/net/ethernet/ti/cpts.c
+++ b/drivers/net/ethernet/ti/cpts.c
@@ -356,15 +356,8 @@ int cpts_register(struct device *dev, struct cpts *cpts,
 		  u32 mult, u32 shift)
 {
 	int err, i;
-	unsigned long flags;
 
 	cpts->info = cpts_info;
-	cpts->clock = ptp_clock_register(&cpts->info, dev);
-	if (IS_ERR(cpts->clock)) {
-		err = PTR_ERR(cpts->clock);
-		cpts->clock = NULL;
-		return err;
-	}
 	spin_lock_init(&cpts->lock);
 
 	cpts->cc.read = cpts_systim_read;
@@ -382,15 +375,26 @@ int cpts_register(struct device *dev, struct cpts *cpts,
 	cpts_write32(cpts, CPTS_EN, control);
 	cpts_write32(cpts, TS_PEND_EN, int_enable);
 
-	spin_lock_irqsave(&cpts->lock, flags);
 	timecounter_init(&cpts->tc, &cpts->cc, ktime_to_ns(ktime_get_real()));
-	spin_unlock_irqrestore(&cpts->lock, flags);
 
 	INIT_DELAYED_WORK(&cpts->overflow_work, cpts_overflow_check);
-	schedule_delayed_work(&cpts->overflow_work, CPTS_OVERFLOW_PERIOD);
 
+	cpts->clock = ptp_clock_register(&cpts->info, dev);
+	if (IS_ERR(cpts->clock)) {
+		err = PTR_ERR(cpts->clock);
+		cpts->clock = NULL;
+		goto err_ptp;
+	}
 	cpts->phc_index = ptp_clock_index(cpts->clock);
+
+	schedule_delayed_work(&cpts->overflow_work, CPTS_OVERFLOW_PERIOD);
+
 	return 0;
+
+err_ptp:
+	if (cpts->refclk)
+		cpts_clk_release(cpts);
+	return err;
 }
 EXPORT_SYMBOL_GPL(cpts_register);
 
-- 
2.10.1

[toc] | [prev] | [next] | [standalone]


#1532065 — Re: [PATCH v2 05/13] net: ethernet: ti: cpts: fix registration order

FromRichard Cochran <richardcochran@gmail.com>
Date2016-11-29 10:50 +0100
SubjectRe: [PATCH v2 05/13] net: ethernet: ti: cpts: fix registration order
Message-ID<sINd0-6J1-31@gated-at.bofh.it>
In reply to#1531801
On Mon, Nov 28, 2016 at 05:03:29PM -0600, Grygorii Strashko wrote:
> The ptp clock registered before spinlock, which is protecting it, and
> before timecounter and cyclecounter initialization in cpts_register().
> 
> So, ensure that ptp clock is registered the last, after everything
> else is done.
> 
> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>

Acked-by: Richard Cochran <richardcochran@gmail.com>

[toc] | [prev] | [standalone]


Page 2 of 2 — ← Prev page 1 [2]

Back to top | Article view | linux.kernel


csiph-web