Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4a88fb95 authored by Grygorii Strashko's avatar Grygorii Strashko Committed by David S. Miller
Browse files

net: ethernet: ti: cpts: move dt props parsing to cpts driver



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: default avatarGrygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8a2c9a5a
Loading
Loading
Loading
Loading
+1 −15
Original line number Original line Diff line number Diff line
@@ -2524,18 +2524,6 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data,
	}
	}
	data->active_slave = prop;
	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
	data->slave_data = devm_kzalloc(&pdev->dev, data->slaves
					* sizeof(struct cpsw_slave_data),
					* sizeof(struct cpsw_slave_data),
					GFP_KERNEL);
					GFP_KERNEL);
@@ -2990,9 +2978,7 @@ static int cpsw_probe(struct platform_device *pdev)
		goto clean_dma_ret;
		goto clean_dma_ret;
	}
	}


	cpsw->cpts = cpts_create(cpsw->dev, cpts_regs,
	cpsw->cpts = cpts_create(cpsw->dev, cpts_regs, cpsw->dev->of_node);
				 cpsw->data.cpts_clock_mult,
				 cpsw->data.cpts_clock_shift);
	if (IS_ERR(cpsw->cpts)) {
	if (IS_ERR(cpsw->cpts)) {
		ret = PTR_ERR(cpsw->cpts);
		ret = PTR_ERR(cpsw->cpts);
		goto clean_ale_ret;
		goto clean_ale_ret;
+0 −2
Original line number Original line Diff line number Diff line
@@ -31,8 +31,6 @@ struct cpsw_platform_data {
	u32	channels;	/* number of cpdma channels (symmetric) */
	u32	channels;	/* number of cpdma channels (symmetric) */
	u32	slaves;		/* number of slave cpgmac ports */
	u32	slaves;		/* number of slave cpgmac ports */
	u32	active_slave; /* time stamping, ethtool and SIOCGMIIPHY slave */
	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	ale_entries;	/* ale table size */
	u32	bd_ram_size;  /*buffer descriptor ram size */
	u32	bd_ram_size;  /*buffer descriptor ram size */
	u32	mac_control;	/* Mac control register */
	u32	mac_control;	/* Mac control register */
+30 −4
Original line number Original line Diff line number Diff line
@@ -405,10 +405,31 @@ void cpts_unregister(struct cpts *cpts)
}
}
EXPORT_SYMBOL_GPL(cpts_unregister);
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,
struct cpts *cpts_create(struct device *dev, void __iomem *regs,
			 u32 mult, u32 shift)
			 struct device_node *node)
{
{
	struct cpts *cpts;
	struct cpts *cpts;
	int ret;


	cpts = devm_kzalloc(dev, sizeof(*cpts), GFP_KERNEL);
	cpts = devm_kzalloc(dev, sizeof(*cpts), GFP_KERNEL);
	if (!cpts)
	if (!cpts)
@@ -419,6 +440,10 @@ struct cpts *cpts_create(struct device *dev, void __iomem *regs,
	spin_lock_init(&cpts->lock);
	spin_lock_init(&cpts->lock);
	INIT_DELAYED_WORK(&cpts->overflow_work, cpts_overflow_check);
	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");
	cpts->refclk = devm_clk_get(dev, "cpts");
	if (IS_ERR(cpts->refclk)) {
	if (IS_ERR(cpts->refclk)) {
		dev_err(dev, "Failed to get cpts refclk\n");
		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.read = cpts_systim_read;
	cpts->cc.mask = CLOCKSOURCE_MASK(32);
	cpts->cc.mask = CLOCKSOURCE_MASK(32);
	cpts->cc.shift = shift;
	/* save cc.mult original value as it can be modified
	cpts->cc_mult = mult;
	 * by cpts_ptp_adjfreq().
	cpts->cc.mult = mult;
	 */
	cpts->cc_mult = cpts->cc.mult;
	cpts->info = cpts_info;
	cpts->info = cpts_info;


	return cpts;
	return cpts;
+3 −2
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@
#include <linux/clocksource.h>
#include <linux/clocksource.h>
#include <linux/device.h>
#include <linux/device.h>
#include <linux/list.h>
#include <linux/list.h>
#include <linux/of.h>
#include <linux/ptp_clock_kernel.h>
#include <linux/ptp_clock_kernel.h>
#include <linux/skbuff.h>
#include <linux/skbuff.h>
#include <linux/timecounter.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);
int cpts_register(struct cpts *cpts);
void cpts_unregister(struct cpts *cpts);
void cpts_unregister(struct cpts *cpts);
struct cpts *cpts_create(struct device *dev, void __iomem *regs,
struct cpts *cpts_create(struct device *dev, void __iomem *regs,
			 u32 mult, u32 shift);
			 struct device_node *node);
void cpts_release(struct cpts *cpts);
void cpts_release(struct cpts *cpts);


static inline void cpts_rx_enable(struct cpts *cpts, int enable)
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
static inline
struct cpts *cpts_create(struct device *dev, void __iomem *regs,
struct cpts *cpts_create(struct device *dev, void __iomem *regs,
			 u32 mult, u32 shift)
			 struct device_node *node)
{
{
	return NULL;
	return NULL;
}
}