From: Pramod Kumar <pramod.kumar@broadcom.com> To: Rob Herring <robh+dt@kernel.org>, Pawel Moll <pawel.moll@arm.com>, Mark Rutland <mark.rutland@arm.com>, Ian Campbell <ijc+devicetree@hellion.org.uk>, Kumar Gala <galak@codeaurora.org>, Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will.deacon@arm.com>, Kishon Vijay Abraham I <kishon@ti.com>, "David S. Miller" <davem@davemloft.net> 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> Subject: [PATCH v2 1/7] mdio:mux: Enhanced MDIO mux framework for integrated multiplexers Date: Tue, 31 May 2016 19:06:35 +0530 [thread overview] Message-ID: <1464701801-17243-2-git-send-email-pramod.kumar@broadcom.com> (raw) In-Reply-To: <1464701801-17243-1-git-send-email-pramod.kumar@broadcom.com> 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
WARNING: multiple messages have this Message-ID (diff)
From: pramod.kumar@broadcom.com (Pramod Kumar) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH v2 1/7] mdio:mux: Enhanced MDIO mux framework for integrated multiplexers Date: Tue, 31 May 2016 19:06:35 +0530 [thread overview] Message-ID: <1464701801-17243-2-git-send-email-pramod.kumar@broadcom.com> (raw) In-Reply-To: <1464701801-17243-1-git-send-email-pramod.kumar@broadcom.com> 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
next prev parent reply other threads:[~2016-05-31 13:36 UTC|newest] Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-05-31 13:36 [PATCH v2 0/7] Add MDIO bus multiplexer support for iProc SoCs Pramod Kumar 2016-05-31 13:36 ` Pramod Kumar 2016-05-31 13:36 ` Pramod Kumar [this message] 2016-05-31 13:36 ` [PATCH v2 1/7] mdio:mux: Enhanced MDIO mux framework for integrated multiplexers Pramod Kumar 2016-06-01 13:02 ` Andrew Lunn 2016-06-01 13:02 ` Andrew Lunn 2016-06-03 13:41 ` Pramod Kumar 2016-06-03 13:41 ` Pramod Kumar 2016-05-31 13:36 ` [PATCH v2 2/7] DT: phy.txt: Add mdio-integrated-mux property Pramod Kumar 2016-05-31 13:36 ` Pramod Kumar 2016-06-02 23:27 ` Rob Herring 2016-06-02 23:27 ` Rob Herring 2016-06-03 0:46 ` Andrew Lunn 2016-06-03 0:46 ` Andrew Lunn 2016-05-31 13:36 ` [PATCH v2 3/7] binding: mdio-mux: Add DT binding doc for Broadcom MDIO bus mutiplexer Pramod Kumar 2016-05-31 13:36 ` Pramod Kumar 2016-06-03 1:43 ` Rob Herring 2016-06-03 1:43 ` Rob Herring 2016-06-03 14:50 ` Pramod Kumar 2016-06-03 14:50 ` Pramod Kumar 2016-05-31 13:36 ` [PATCH v2 4/7] DT:mdio-mux: Add mdio multiplexer driver node Pramod Kumar 2016-05-31 13:36 ` Pramod Kumar 2016-05-31 13:36 ` [PATCH v2 5/7] net:mdio-mux: Add MDIO mux driver for iProc SoCs Pramod Kumar 2016-05-31 13:36 ` Pramod Kumar 2016-06-01 23:18 ` David Miller 2016-06-01 23:18 ` David Miller 2016-06-03 13:47 ` Pramod Kumar 2016-06-03 13:47 ` Pramod Kumar 2016-05-31 13:36 ` [PATCH v2 6/7] Binding:PHY: Binding doc for NS2 PCIe PHYs Pramod Kumar 2016-05-31 13:36 ` Pramod Kumar 2016-06-03 1:44 ` Rob Herring 2016-06-03 1:44 ` Rob Herring 2016-05-31 13:36 ` [PATCH v2 7/7] phy: Add Northstar2 PCI Phy support Pramod Kumar 2016-05-31 13:36 ` Pramod Kumar 2016-06-01 13:12 ` Andrew Lunn 2016-06-01 13:12 ` Andrew Lunn 2016-06-03 11:23 ` Pramod Kumar 2016-06-03 11:23 ` Pramod Kumar
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=1464701801-17243-2-git-send-email-pramod.kumar@broadcom.com \ --to=pramod.kumar@broadcom.com \ --cc=bcm-kernel-feedback-list@broadcom.com \ --cc=catalin.marinas@arm.com \ --cc=davem@davemloft.net \ --cc=devicetree@vger.kernel.org \ --cc=galak@codeaurora.org \ --cc=ijc+devicetree@hellion.org.uk \ --cc=kishon@ti.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mark.rutland@arm.com \ --cc=netdev@vger.kernel.org \ --cc=pawel.moll@arm.com \ --cc=robh+dt@kernel.org \ --cc=will.deacon@arm.com \ /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: linkBe 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.