Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1410314
| Path | csiph.com!aioe.org!bofh.it!news.nic.it!robomod |
|---|---|
| From | Pramod Kumar <pramod.kumar@broadcom.com> |
| Newsgroups | linux.kernel |
| Subject | [PATCH v2 1/7] mdio:mux: Enhanced MDIO mux framework for integrated multiplexers |
| Date | Tue, 31 May 2016 15:40:01 +0200 |
| Message-ID | <rES3L-3kr-9@gated-at.bofh.it> (permalink) |
| References | <rES3L-3kr-5@gated-at.bofh.it> |
| Dkim-Signature | v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=W387FT/kjCKWdtJDObT/LkvxjWjoDOJt2WlbvOWkHho=; b=WLkaHULXNwjwDICdJPH7Cmz4hRk8i9sjOKNse6ymIcEbPGeJ0eqQ0bEEE2pahUbbbb /EjrzK100cu98PUXXIFoaImKtiOHQPD5VPRMlzmewe3tO6FBiEn7571tMy6GLpn83vtX e13bdVJSTOkoJ6bb4pbRpvOt34iSbz7ugpA3c= |
| X-Google-Dkim-Signature | v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=W387FT/kjCKWdtJDObT/LkvxjWjoDOJt2WlbvOWkHho=; b=DN+FgZHd9aFCy3UtzPuh4rjsLc0yhKj7JcUFP5o+QbN5BZY//XFdwnZ2iP+6CEDZWx 6xzwKr042f4F+qXLF5bDBYiPBNcD1W1YX6fbDPh6PQR1CPUHxuYrf0bjivulyMhotpsu IiC6P8Nk42AS6laCWSu4uVC5LopJQbIwoZ1u+sI6gPBGepTlXPb9fvc5PvzaBRziYQ/z CJo6lK3Bk8HCG/CY8gSNFudhTUsSWNrYY6vFG2/fPiT0aLkK2CD+L7kyD6E/H7aSx/qa 9U5fKD4p2Lf6vhUtzBLi85P+gig2HYfXCLQJlmLFkUqEwRqirGCG2TU5Mn4z6WUVYHGp xKUg== |
| X-Gm-Message-State | ALyK8tJyqe0qRNc2SozV/toyGYL7Q8+CHheX+YvJqaJ80cc2aJTJ9fS6hUnjbimYP1b0ws47 |
| X-Received | by 10.98.78.206 with SMTP id c197mr54588895pfb.129.1464701779950; Tue, 31 May 2016 06:36:19 -0700 (PDT) |
| X-Mailer | git-send-email 1.9.1 |
| Sender | robomod@news.nic.it |
| List-ID | <linux-kernel.vger.kernel.org> |
| X-Mailing-List | linux-kernel@vger.kernel.org |
| Approved | robomod@news.nic.it |
| Lines | 148 |
| Organization | linux.* mail to news gateway |
| X-Original-Cc | devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, bcm-kernel-feedback-list@broadcom.com, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Pramod Kumar <pramod.kumar@broadcom.com> |
| X-Original-Date | Tue, 31 May 2016 19:06:35 +0530 |
| X-Original-Message-ID | <1464701801-17243-2-git-send-email-pramod.kumar@broadcom.com> |
| X-Original-References | <1464701801-17243-1-git-send-email-pramod.kumar@broadcom.com> |
| X-Original-Sender | linux-kernel-owner@vger.kernel.org |
| Xref | csiph.com linux.kernel:1410314 |
Show key headers only | View raw
An integrated multiplexer uses same address space for
"muxed bus selection" and "generation of mdio transaction"
hence its good to register parent bus from mux driver.
Hence added a mechanism where mux driver could register a
parent bus and pass it down to framework via mdio_mux_init api.
Below changes are required to make this happen-
1. When mdio-mux parent bus is registered, mdio framework should not
parse for child as it will be muxed bus node not PHYs.
-created a new property "mdio-mux-bus-parent". if this property is present,
of_mdiobus_register will not scan for phys.
2. Passed down parent bus to mdio mux framework via mdio-mux-init api.
Signed-off-by: Pramod Kumar <pramod.kumar@broadcom.com>
---
drivers/net/phy/mdio-mux-gpio.c | 2 +-
drivers/net/phy/mdio-mux-mmioreg.c | 2 +-
drivers/net/phy/mdio-mux.c | 28 ++++++++++++++++++----------
drivers/of/of_mdio.c | 3 +++
include/linux/mdio-mux.h | 4 +++-
5 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/drivers/net/phy/mdio-mux-gpio.c b/drivers/net/phy/mdio-mux-gpio.c
index 7ddb1ab..9199499 100644
--- a/drivers/net/phy/mdio-mux-gpio.c
+++ b/drivers/net/phy/mdio-mux-gpio.c
@@ -55,7 +55,7 @@ static int mdio_mux_gpio_probe(struct platform_device *pdev)
return PTR_ERR(s->gpios);
r = mdio_mux_init(&pdev->dev,
- mdio_mux_gpio_switch_fn, &s->mux_handle, s);
+ mdio_mux_gpio_switch_fn, &s->mux_handle, s, NULL);
if (r != 0) {
gpiod_put_array(s->gpios);
diff --git a/drivers/net/phy/mdio-mux-mmioreg.c b/drivers/net/phy/mdio-mux-mmioreg.c
index 7fde454..d0bed52 100644
--- a/drivers/net/phy/mdio-mux-mmioreg.c
+++ b/drivers/net/phy/mdio-mux-mmioreg.c
@@ -126,7 +126,7 @@ static int mdio_mux_mmioreg_probe(struct platform_device *pdev)
}
ret = mdio_mux_init(&pdev->dev, mdio_mux_mmioreg_switch_fn,
- &s->mux_handle, s);
+ &s->mux_handle, s, NULL);
if (ret) {
dev_err(&pdev->dev, "failed to register mdio-mux bus %s\n",
np->full_name);
diff --git a/drivers/net/phy/mdio-mux.c b/drivers/net/phy/mdio-mux.c
index 308ade0..521ab90 100644
--- a/drivers/net/phy/mdio-mux.c
+++ b/drivers/net/phy/mdio-mux.c
@@ -95,7 +95,8 @@ static int parent_count;
int mdio_mux_init(struct device *dev,
int (*switch_fn)(int cur, int desired, void *data),
void **mux_handle,
- void *data)
+ void *data,
+ struct mii_bus *mux_bus)
{
struct device_node *parent_bus_node;
struct device_node *child_bus_node;
@@ -107,10 +108,21 @@ int mdio_mux_init(struct device *dev,
if (!dev->of_node)
return -ENODEV;
- parent_bus_node = of_parse_phandle(dev->of_node, "mdio-parent-bus", 0);
+ if (!mux_bus) {
+ parent_bus_node = of_parse_phandle(dev->of_node,
+ "mdio-parent-bus", 0);
- if (!parent_bus_node)
- return -ENODEV;
+ if (!parent_bus_node)
+ return -ENODEV;
+
+ parent_bus = of_mdio_find_bus(parent_bus_node);
+ if (!parent_bus) {
+ ret_val = -EPROBE_DEFER;
+ goto err_parent_bus;
+ }
+ } else {
+ parent_bus = mux_bus;
+ }
pb = devm_kzalloc(dev, sizeof(*pb), GFP_KERNEL);
if (pb == NULL) {
@@ -118,11 +130,6 @@ int mdio_mux_init(struct device *dev,
goto err_parent_bus;
}
- parent_bus = of_mdio_find_bus(parent_bus_node);
- if (parent_bus == NULL) {
- ret_val = -EPROBE_DEFER;
- goto err_parent_bus;
- }
pb->switch_data = data;
pb->switch_fn = switch_fn;
@@ -183,7 +190,8 @@ int mdio_mux_init(struct device *dev,
put_device(&pb->mii_bus->dev);
err_parent_bus:
- of_node_put(parent_bus_node);
+ if (!mux_bus)
+ of_node_put(parent_bus_node);
return ret_val;
}
EXPORT_SYMBOL_GPL(mdio_mux_init);
diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c
index 8453f08..cf40e7a 100644
--- a/drivers/of/of_mdio.c
+++ b/drivers/of/of_mdio.c
@@ -225,6 +225,9 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
if (rc)
return rc;
+ if (of_property_read_bool(np, "mdio-integrated-mux"))
+ return 0;
+
/* Loop over the child nodes and register a phy_device for each phy */
for_each_available_child_of_node(np, child) {
addr = of_mdio_parse_addr(&mdio->dev, child);
diff --git a/include/linux/mdio-mux.h b/include/linux/mdio-mux.h
index a243dbb..61f5b21 100644
--- a/include/linux/mdio-mux.h
+++ b/include/linux/mdio-mux.h
@@ -10,11 +10,13 @@
#ifndef __LINUX_MDIO_MUX_H
#define __LINUX_MDIO_MUX_H
#include <linux/device.h>
+#include <linux/phy.h>
int mdio_mux_init(struct device *dev,
int (*switch_fn) (int cur, int desired, void *data),
void **mux_handle,
- void *data);
+ void *data,
+ struct mii_bus *mux_bus);
void mdio_mux_uninit(void *mux_handle);
--
1.9.1
Back to linux.kernel | Previous | Next — Next in thread | Find similar | Unroll thread
[PATCH v2 1/7] mdio:mux: Enhanced MDIO mux framework for integrated multiplexers Pramod Kumar <pramod.kumar@broadcom.com> - 2016-05-31 15:40 +0200
Re: [PATCH v2 1/7] mdio:mux: Enhanced MDIO mux framework for integrated multiplexers Andrew Lunn <andrew@lunn.ch> - 2016-06-01 15:10 +0200
RE: [PATCH v2 1/7] mdio:mux: Enhanced MDIO mux framework for integrated multiplexers Pramod Kumar <pramod.kumar@broadcom.com> - 2016-06-03 15:50 +0200
csiph-web