Commit c8395d4e authored by Grygorii Strashko's avatar Grygorii Strashko Committed by David S. Miller

net: ethernet: ti: allow cpts to be built separately

TI CPTS IP is used as part of TI OMAP CPSW driver, but it's also
present as part of NETCP on TI Keystone 2 SoCs. So, It's required
to enable build of CPTS for both this drivers and this can be
achieved by allowing CPTS to be built separately.

Hence, allow cpts to be built separately and convert it to be
a module as both CPSW and NETCP drives can be built as modules.
Signed-off-by: default avatarGrygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 391fd6ca
...@@ -74,7 +74,7 @@ config TI_CPSW ...@@ -74,7 +74,7 @@ config TI_CPSW
will be called cpsw. will be called cpsw.
config TI_CPTS config TI_CPTS
bool "TI Common Platform Time Sync (CPTS) Support" tristate "TI Common Platform Time Sync (CPTS) Support"
depends on TI_CPSW depends on TI_CPSW
select PTP_1588_CLOCK select PTP_1588_CLOCK
---help--- ---help---
......
...@@ -12,8 +12,9 @@ obj-$(CONFIG_TI_DAVINCI_MDIO) += davinci_mdio.o ...@@ -12,8 +12,9 @@ obj-$(CONFIG_TI_DAVINCI_MDIO) += davinci_mdio.o
obj-$(CONFIG_TI_DAVINCI_CPDMA) += davinci_cpdma.o obj-$(CONFIG_TI_DAVINCI_CPDMA) += davinci_cpdma.o
obj-$(CONFIG_TI_CPSW_PHY_SEL) += cpsw-phy-sel.o obj-$(CONFIG_TI_CPSW_PHY_SEL) += cpsw-phy-sel.o
obj-$(CONFIG_TI_CPSW_ALE) += cpsw_ale.o obj-$(CONFIG_TI_CPSW_ALE) += cpsw_ale.o
obj-$(CONFIG_TI_CPTS) += cpts.o
obj-$(CONFIG_TI_CPSW) += ti_cpsw.o obj-$(CONFIG_TI_CPSW) += ti_cpsw.o
ti_cpsw-y := cpsw.o cpts.o ti_cpsw-y := cpsw.o
obj-$(CONFIG_TI_KEYSTONE_NETCP) += keystone_netcp.o obj-$(CONFIG_TI_KEYSTONE_NETCP) += keystone_netcp.o
keystone_netcp-y := netcp_core.o keystone_netcp-y := netcp_core.o
......
...@@ -1594,7 +1594,7 @@ static netdev_tx_t cpsw_ndo_start_xmit(struct sk_buff *skb, ...@@ -1594,7 +1594,7 @@ static netdev_tx_t cpsw_ndo_start_xmit(struct sk_buff *skb,
return NETDEV_TX_BUSY; return NETDEV_TX_BUSY;
} }
#ifdef CONFIG_TI_CPTS #if IS_ENABLED(CONFIG_TI_CPTS)
static void cpsw_hwtstamp_v1(struct cpsw_common *cpsw) static void cpsw_hwtstamp_v1(struct cpsw_common *cpsw)
{ {
...@@ -1742,7 +1742,16 @@ static int cpsw_hwtstamp_get(struct net_device *dev, struct ifreq *ifr) ...@@ -1742,7 +1742,16 @@ static int cpsw_hwtstamp_get(struct net_device *dev, struct ifreq *ifr)
return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0;
} }
#else
static int cpsw_hwtstamp_get(struct net_device *dev, struct ifreq *ifr)
{
return -EOPNOTSUPP;
}
static int cpsw_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
{
return -EOPNOTSUPP;
}
#endif /*CONFIG_TI_CPTS*/ #endif /*CONFIG_TI_CPTS*/
static int cpsw_ndo_ioctl(struct net_device *dev, struct ifreq *req, int cmd) static int cpsw_ndo_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
...@@ -1755,12 +1764,10 @@ static int cpsw_ndo_ioctl(struct net_device *dev, struct ifreq *req, int cmd) ...@@ -1755,12 +1764,10 @@ static int cpsw_ndo_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
return -EINVAL; return -EINVAL;
switch (cmd) { switch (cmd) {
#ifdef CONFIG_TI_CPTS
case SIOCSHWTSTAMP: case SIOCSHWTSTAMP:
return cpsw_hwtstamp_set(dev, req); return cpsw_hwtstamp_set(dev, req);
case SIOCGHWTSTAMP: case SIOCGHWTSTAMP:
return cpsw_hwtstamp_get(dev, req); return cpsw_hwtstamp_get(dev, req);
#endif
} }
if (!cpsw->slaves[slave_no].phy) if (!cpsw->slaves[slave_no].phy)
...@@ -2100,10 +2107,10 @@ static void cpsw_set_msglevel(struct net_device *ndev, u32 value) ...@@ -2100,10 +2107,10 @@ static void cpsw_set_msglevel(struct net_device *ndev, u32 value)
priv->msg_enable = value; priv->msg_enable = value;
} }
#if IS_ENABLED(CONFIG_TI_CPTS)
static int cpsw_get_ts_info(struct net_device *ndev, static int cpsw_get_ts_info(struct net_device *ndev,
struct ethtool_ts_info *info) struct ethtool_ts_info *info)
{ {
#ifdef CONFIG_TI_CPTS
struct cpsw_common *cpsw = ndev_to_cpsw(ndev); struct cpsw_common *cpsw = ndev_to_cpsw(ndev);
info->so_timestamping = info->so_timestamping =
...@@ -2120,7 +2127,12 @@ static int cpsw_get_ts_info(struct net_device *ndev, ...@@ -2120,7 +2127,12 @@ static int cpsw_get_ts_info(struct net_device *ndev,
info->rx_filters = info->rx_filters =
(1 << HWTSTAMP_FILTER_NONE) | (1 << HWTSTAMP_FILTER_NONE) |
(1 << HWTSTAMP_FILTER_PTP_V2_EVENT); (1 << HWTSTAMP_FILTER_PTP_V2_EVENT);
return 0;
}
#else #else
static int cpsw_get_ts_info(struct net_device *ndev,
struct ethtool_ts_info *info)
{
info->so_timestamping = info->so_timestamping =
SOF_TIMESTAMPING_TX_SOFTWARE | SOF_TIMESTAMPING_TX_SOFTWARE |
SOF_TIMESTAMPING_RX_SOFTWARE | SOF_TIMESTAMPING_RX_SOFTWARE |
...@@ -2128,9 +2140,9 @@ static int cpsw_get_ts_info(struct net_device *ndev, ...@@ -2128,9 +2140,9 @@ static int cpsw_get_ts_info(struct net_device *ndev,
info->phc_index = -1; info->phc_index = -1;
info->tx_types = 0; info->tx_types = 0;
info->rx_filters = 0; info->rx_filters = 0;
#endif
return 0; return 0;
} }
#endif
static int cpsw_get_link_ksettings(struct net_device *ndev, static int cpsw_get_link_ksettings(struct net_device *ndev,
struct ethtool_link_ksettings *ecmd) struct ethtool_link_ksettings *ecmd)
......
...@@ -31,8 +31,6 @@ ...@@ -31,8 +31,6 @@
#include "cpts.h" #include "cpts.h"
#ifdef CONFIG_TI_CPTS
#define cpts_read32(c, r) readl_relaxed(&c->reg->r) #define cpts_read32(c, r) readl_relaxed(&c->reg->r)
#define cpts_write32(c, v, r) writel_relaxed(v, &c->reg->r) #define cpts_write32(c, v, r) writel_relaxed(v, &c->reg->r)
...@@ -334,6 +332,7 @@ void cpts_rx_timestamp(struct cpts *cpts, struct sk_buff *skb) ...@@ -334,6 +332,7 @@ void cpts_rx_timestamp(struct cpts *cpts, struct sk_buff *skb)
memset(ssh, 0, sizeof(*ssh)); memset(ssh, 0, sizeof(*ssh));
ssh->hwtstamp = ns_to_ktime(ns); ssh->hwtstamp = ns_to_ktime(ns);
} }
EXPORT_SYMBOL_GPL(cpts_rx_timestamp);
void cpts_tx_timestamp(struct cpts *cpts, struct sk_buff *skb) void cpts_tx_timestamp(struct cpts *cpts, struct sk_buff *skb)
{ {
...@@ -349,13 +348,11 @@ void cpts_tx_timestamp(struct cpts *cpts, struct sk_buff *skb) ...@@ -349,13 +348,11 @@ void cpts_tx_timestamp(struct cpts *cpts, struct sk_buff *skb)
ssh.hwtstamp = ns_to_ktime(ns); ssh.hwtstamp = ns_to_ktime(ns);
skb_tstamp_tx(skb, &ssh); skb_tstamp_tx(skb, &ssh);
} }
EXPORT_SYMBOL_GPL(cpts_tx_timestamp);
#endif /*CONFIG_TI_CPTS*/
int cpts_register(struct device *dev, struct cpts *cpts, int cpts_register(struct device *dev, struct cpts *cpts,
u32 mult, u32 shift) u32 mult, u32 shift)
{ {
#ifdef CONFIG_TI_CPTS
int err, i; int err, i;
unsigned long flags; unsigned long flags;
...@@ -391,18 +388,21 @@ int cpts_register(struct device *dev, struct cpts *cpts, ...@@ -391,18 +388,21 @@ int cpts_register(struct device *dev, struct cpts *cpts,
schedule_delayed_work(&cpts->overflow_work, CPTS_OVERFLOW_PERIOD); schedule_delayed_work(&cpts->overflow_work, CPTS_OVERFLOW_PERIOD);
cpts->phc_index = ptp_clock_index(cpts->clock); cpts->phc_index = ptp_clock_index(cpts->clock);
#endif
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(cpts_register);
void cpts_unregister(struct cpts *cpts) void cpts_unregister(struct cpts *cpts)
{ {
#ifdef CONFIG_TI_CPTS
if (cpts->clock) { if (cpts->clock) {
ptp_clock_unregister(cpts->clock); ptp_clock_unregister(cpts->clock);
cancel_delayed_work_sync(&cpts->overflow_work); cancel_delayed_work_sync(&cpts->overflow_work);
} }
if (cpts->refclk) if (cpts->refclk)
cpts_clk_release(cpts); cpts_clk_release(cpts);
#endif
} }
EXPORT_SYMBOL_GPL(cpts_unregister);
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("TI CPTS driver");
MODULE_AUTHOR("Richard Cochran <richardcochran@gmail.com>");
...@@ -111,7 +111,7 @@ struct cpts { ...@@ -111,7 +111,7 @@ struct cpts {
struct cpsw_cpts __iomem *reg; struct cpsw_cpts __iomem *reg;
int tx_enable; int tx_enable;
int rx_enable; int rx_enable;
#ifdef CONFIG_TI_CPTS #if IS_ENABLED(CONFIG_TI_CPTS)
struct ptp_clock_info info; struct ptp_clock_info info;
struct ptp_clock *clock; struct ptp_clock *clock;
spinlock_t lock; /* protects time registers */ spinlock_t lock; /* protects time registers */
...@@ -127,9 +127,11 @@ struct cpts { ...@@ -127,9 +127,11 @@ struct cpts {
#endif #endif
}; };
#ifdef CONFIG_TI_CPTS #if IS_ENABLED(CONFIG_TI_CPTS)
void cpts_rx_timestamp(struct cpts *cpts, struct sk_buff *skb); void cpts_rx_timestamp(struct cpts *cpts, struct sk_buff *skb);
void cpts_tx_timestamp(struct cpts *cpts, struct sk_buff *skb); void cpts_tx_timestamp(struct cpts *cpts, struct sk_buff *skb);
int cpts_register(struct device *dev, struct cpts *cpts, u32 mult, u32 shift);
void cpts_unregister(struct cpts *cpts);
#else #else
static inline void cpts_rx_timestamp(struct cpts *cpts, struct sk_buff *skb) static inline void cpts_rx_timestamp(struct cpts *cpts, struct sk_buff *skb)
{ {
...@@ -137,9 +139,17 @@ static inline void cpts_rx_timestamp(struct cpts *cpts, struct sk_buff *skb) ...@@ -137,9 +139,17 @@ static inline void cpts_rx_timestamp(struct cpts *cpts, struct sk_buff *skb)
static inline void cpts_tx_timestamp(struct cpts *cpts, struct sk_buff *skb) static inline void cpts_tx_timestamp(struct cpts *cpts, struct sk_buff *skb)
{ {
} }
static inline int
cpts_register(struct device *dev, struct cpts *cpts, u32 mult, u32 shift)
{
return 0;
}
static inline void cpts_unregister(struct cpts *cpts)
{
}
#endif #endif
int cpts_register(struct device *dev, struct cpts *cpts, u32 mult, u32 shift);
void cpts_unregister(struct cpts *cpts);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment