Skip to content

Commit

Permalink
mdio: mux: Enhanced MDIO mux framework for integrated multiplexers
Browse files Browse the repository at this point in the history
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.

Signed-off-by: Pramod Kumar <[email protected]>
Reviewed-by: Andrew Lunn <[email protected]>
Reviewed-by: Florian Fainelli <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Pramod Kumar authored and davem330 committed Jun 11, 2016
1 parent d46e416 commit f20e665
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 13 deletions.
2 changes: 1 addition & 1 deletion drivers/net/phy/mdio-mux-gpio.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/phy/mdio-mux-mmioreg.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
28 changes: 18 additions & 10 deletions drivers/net/phy/mdio-mux.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,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;
Expand All @@ -101,22 +102,28 @@ 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) {
ret_val = -ENOMEM;
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;
Expand Down Expand Up @@ -177,7 +184,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);
Expand Down
4 changes: 3 additions & 1 deletion include/linux/mdio-mux.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit f20e665

Please sign in to comment.