From: Moritz Fischer <mdf@kernel.org>
To: davem@davemloft.net
Cc: keescook@chromium.org, f.fainelli@gmail.com,
linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
alex.williams@ni.com, Moritz Fischer <mdf@kernel.org>
Subject: [PATCH net-next 2/3] net: nixge: Add support for having nixge as subdevice
Date: Wed, 29 Aug 2018 17:40:45 -0700 [thread overview]
Message-ID: <20180830004046.9417-3-mdf@kernel.org> (raw)
In-Reply-To: <20180830004046.9417-1-mdf@kernel.org>
Add support for instantiating nixge as subdevice using
fixed-link and platform data to configure it.
Signed-off-by: Moritz Fischer <mdf@kernel.org>
---
Hi,
not this patch is still in the early stages,
and as the rest of this series goes on top of [1].
The actual platform data might still change since
the parent device driver is still under development.
Thanks for your time,
Moritz
[1] https://lkml.org/lkml/2018/8/28/1011
---
drivers/net/ethernet/ni/nixge.c | 71 ++++++++++++++++++++++++++---
include/linux/platform_data/nixge.h | 19 ++++++++
2 files changed, 83 insertions(+), 7 deletions(-)
create mode 100644 include/linux/platform_data/nixge.h
diff --git a/drivers/net/ethernet/ni/nixge.c b/drivers/net/ethernet/ni/nixge.c
index 670249313ff0..fd8e5b02c459 100644
--- a/drivers/net/ethernet/ni/nixge.c
+++ b/drivers/net/ethernet/ni/nixge.c
@@ -7,6 +7,8 @@
#include <linux/etherdevice.h>
#include <linux/module.h>
#include <linux/netdevice.h>
+#include <linux/phy_fixed.h>
+#include <linux/platform_data/nixge.h>
#include <linux/of_address.h>
#include <linux/of_mdio.h>
#include <linux/of_net.h>
@@ -167,6 +169,7 @@ struct nixge_priv {
/* Connection to PHY device */
struct device_node *phy_node;
phy_interface_t phy_mode;
+ struct phy_device *phydev;
int link;
unsigned int speed;
@@ -859,15 +862,25 @@ static void nixge_dma_err_handler(unsigned long data)
static int nixge_open(struct net_device *ndev)
{
struct nixge_priv *priv = netdev_priv(ndev);
- struct phy_device *phy;
+ struct phy_device *phy = NULL;
int ret;
nixge_device_reset(ndev);
- phy = of_phy_connect(ndev, priv->phy_node,
- &nixge_handle_link_change, 0, priv->phy_mode);
- if (!phy)
- return -ENODEV;
+ if (priv->dev->of_node) {
+ phy = of_phy_connect(ndev, priv->phy_node,
+ &nixge_handle_link_change, 0,
+ priv->phy_mode);
+ if (!phy)
+ return -ENODEV;
+ } else if (priv->phydev) {
+ ret = phy_connect_direct(ndev, priv->phydev,
+ &nixge_handle_link_change,
+ priv->phy_mode);
+ if (ret)
+ return ret;
+ phy = priv->phydev;
+ }
phy_start(phy);
@@ -1215,10 +1228,41 @@ static int nixge_of_get_phy(struct nixge_priv *priv, struct device_node *np)
return 0;
}
+static int nixge_pdata_get_phy(struct nixge_priv *priv,
+ struct nixge_platform_data *pdata)
+{
+ struct phy_device *phy = NULL;
+
+ if (!pdata)
+ return -EINVAL;
+
+ if (pdata && pdata->phy_interface == PHY_INTERFACE_MODE_NA) {
+ struct fixed_phy_status fphy_status = {
+ .link = 1,
+ .duplex = pdata->phy_duplex,
+ .speed = pdata->phy_speed,
+ .pause = 0,
+ .asym_pause = 0,
+ };
+
+ /* TODO: Pull out GPIO from pdata */
+ phy = fixed_phy_register(PHY_POLL, &fphy_status, -1,
+ NULL);
+ if (IS_ERR_OR_NULL(phy)) {
+ dev_err(priv->dev,
+ "failed to register fixed PHY device\n");
+ return -ENODEV;
+ }
+ }
+ priv->phy_mode = pdata->phy_interface;
+ priv->phydev = phy;
+
+ return 0;
+}
+
static int nixge_mdio_setup(struct nixge_priv *priv, struct device_node *np)
{
struct mii_bus *bus;
- int err;
bus = devm_mdiobus_alloc(priv->dev);
if (!bus)
@@ -1254,6 +1298,7 @@ static void *nixge_get_nvmem_address(struct device *dev)
static int nixge_probe(struct platform_device *pdev)
{
+ struct nixge_platform_data *pdata = NULL;
struct nixge_priv *priv;
struct net_device *ndev;
struct resource *dmares;
@@ -1320,10 +1365,16 @@ static int nixge_probe(struct platform_device *pdev)
err = nixge_of_get_phy(priv, np);
if (err)
goto free_netdev;
+ } else {
+ pdata = dev_get_platdata(&pdev->dev);
+ err = nixge_pdata_get_phy(priv, pdata);
+ if (err)
+ goto free_netdev;
}
/* only if it's not a fixed link, do we care about MDIO at all */
- if (priv->phy_node && !of_phy_is_fixed_link(np)) {
+ if ((priv->phy_node && !of_phy_is_fixed_link(np)) ||
+ (pdata && pdata->phy_interface != PHY_INTERFACE_MODE_NA)) {
err = nixge_mdio_setup(priv, np);
if (err) {
dev_err(&pdev->dev, "error registering mdio bus");
@@ -1347,6 +1398,9 @@ static int nixge_probe(struct platform_device *pdev)
of_phy_deregister_fixed_link(np);
of_node_put(np);
}
+
+ if (priv->phydev && phy_is_pseudo_fixed_link(priv->phydev))
+ fixed_phy_unregister(priv->phydev);
free_netdev:
free_netdev(ndev);
@@ -1357,6 +1411,7 @@ static int nixge_remove(struct platform_device *pdev)
{
struct net_device *ndev = platform_get_drvdata(pdev);
struct nixge_priv *priv = netdev_priv(ndev);
+ struct device_node *np = pdev->dev.of_node;
unregister_netdev(ndev);
@@ -1365,6 +1420,8 @@ static int nixge_remove(struct platform_device *pdev)
if (np && of_phy_is_fixed_link(np))
of_phy_deregister_fixed_link(np);
+ else if (priv->phydev && phy_is_pseudo_fixed_link(priv->phydev))
+ fixed_phy_unregister(priv->phydev);
free_netdev(ndev);
diff --git a/include/linux/platform_data/nixge.h b/include/linux/platform_data/nixge.h
new file mode 100644
index 000000000000..aa5dd5760074
--- /dev/null
+++ b/include/linux/platform_data/nixge.h
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (c) 2018 National Instruments Corp.
+ *
+ * Author: Moritz Fischer <mdf@kernel.org>
+ */
+
+#ifndef __NIXGE_PDATA_H__
+#define __NIXGE_PDATA_H__
+
+#include <linux/phy.h>
+
+struct nixge_platform_data {
+ phy_interface_t phy_interface;
+ int phy_speed;
+ int phy_duplex;
+};
+
+#endif /* __NIXGE_PDATA_H__ */
+
--
2.18.0
next prev parent reply other threads:[~2018-08-30 0:50 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-30 0:40 [PATCH net-next 0/3] nixge: fixed-link support Moritz Fischer
2018-08-30 0:40 ` [PATCH net-next 1/3] net: nixge: Add support for fixed-link subnodes Moritz Fischer
2018-08-30 3:04 ` Andrew Lunn
2018-08-30 17:21 ` Moritz Fischer
2018-08-30 17:54 ` Andrew Lunn
2018-08-30 21:09 ` Moritz Fischer
2018-08-30 17:44 ` kbuild test robot
2018-08-30 0:40 ` Moritz Fischer [this message]
2018-08-30 1:07 ` [PATCH net-next 2/3] net: nixge: Add support for having nixge as subdevice Moritz Fischer
2018-08-30 3:11 ` Andrew Lunn
2018-08-30 16:39 ` Moritz Fischer
2018-08-30 17:42 ` Andrew Lunn
2018-08-30 0:40 ` [PATCH net-next 3/3] net: nixge: Use sysdev instead of ndev->dev.parent for DMA Moritz Fischer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180830004046.9417-3-mdf@kernel.org \
--to=mdf@kernel.org \
--cc=alex.williams@ni.com \
--cc=davem@davemloft.net \
--cc=f.fainelli@gmail.com \
--cc=keescook@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.