[U-Boot] [PATCH 1/4 v3] net: add MDIO_MUX DM class

Bin Meng bmeng.cn at gmail.com
Mon Jul 8 07:40:42 UTC 2019


On Tue, Jun 18, 2019 at 10:58 PM Alexandru Marginean
<alexandru.marginean at nxp.com> wrote:
>
> Adds a class for MDIO MUXes, which control access to a series of
> downstream child MDIOs.
> MDIO MUX drivers are required to implement a select function used to switch
> between child buses.
> MUX children are registered as MDIO buses and they can be used just like
> regular MDIOs.
>
> Signed-off-by: Alex Marginean <alexm.osslist at gmail.com>
> ---
>
> Changes in v2:
>         - no change
> Changes in v3:
>         - no change, just fighting with the email server
>
>  drivers/net/Kconfig    |  12 +++
>  include/dm/uclass-id.h |   1 +
>  include/miiphy.h       |  20 ++++
>  net/Makefile           |   1 +
>  net/mdio-mux-uclass.c  | 232 +++++++++++++++++++++++++++++++++++++++++
>  5 files changed, 266 insertions(+)
>  create mode 100644 net/mdio-mux-uclass.c
>
> diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
> index 635f8d72c2..0dc26ac254 100644
> --- a/drivers/net/Kconfig
> +++ b/drivers/net/Kconfig
> @@ -24,6 +24,18 @@ config DM_MDIO
>           This is currently implemented in net/mdio-uclass.c
>           Look in include/miiphy.h for details.
>
> +config DM_MDIO_MUX
> +       bool "Enable Driver Model for MDIO MUX devices"
> +       depends on DM_MDIO
> +       help
> +         Enable driver model for MDIO MUX devices
> +
> +         Adds UCLASS_MDIO_MUX DM class supporting MDIO MUXes.  Useful for
> +         systems that support DM_MDIO and integrate one or multiple muxes on
> +         the MDIO bus.
> +         This is currently implemented in net/mdio-mux-uclass.c
> +         Look in include/miiphy.h for details.
> +
>  config MDIO_SANDBOX
>         depends on DM_MDIO && SANDBOX
>         default y
> diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
> index 90667e62cf..b859a9ec04 100644
> --- a/include/dm/uclass-id.h
> +++ b/include/dm/uclass-id.h
> @@ -59,6 +59,7 @@ enum uclass_id {
>         UCLASS_MAILBOX,         /* Mailbox controller */
>         UCLASS_MASS_STORAGE,    /* Mass storage device */
>         UCLASS_MDIO,            /* MDIO bus */
> +       UCLASS_MDIO_MUX,        /* MDIO MUX/switch */
>         UCLASS_MISC,            /* Miscellaneous device */
>         UCLASS_MMC,             /* SD / MMC card or chip */
>         UCLASS_MOD_EXP,         /* RSA Mod Exp device */
> diff --git a/include/miiphy.h b/include/miiphy.h
> index e6dd441983..9b97d09f18 100644
> --- a/include/miiphy.h
> +++ b/include/miiphy.h
> @@ -167,4 +167,24 @@ struct phy_device *dm_mdio_phy_connect(struct udevice *dev, int addr,
>
>  #endif
>
> +#ifdef CONFIG_DM_MDIO_MUX
> +
> +/* indicates none of the child buses is selected */
> +#define MDIO_MUX_SELECT_NONE   -1
> +
> +/**
> + * struct mdio_mux_ops - MDIO MUX operations
> + *
> + * @select: Selects a child bus
> + * @deselect: Clean up selection.  Optional, can be NULL
> + */
> +struct mdio_mux_ops {
> +       int (*select)(struct udevice *mux, int cur, int sel);
> +       int (*deselect)(struct udevice *mux, int sel);
> +};
> +
> +#define mdio_mux_get_ops(dev) ((struct mdio_mux_ops *)(dev)->driver->ops)
> +
> +#endif
> +
>  #endif
> diff --git a/net/Makefile b/net/Makefile
> index 6251ff3991..826544f05f 100644
> --- a/net/Makefile
> +++ b/net/Makefile
> @@ -16,6 +16,7 @@ else
>  obj-$(CONFIG_NET)      += eth_legacy.o
>  endif
>  obj-$(CONFIG_DM_MDIO)  += mdio-uclass.o
> +obj-$(CONFIG_DM_MDIO_MUX) += mdio-mux-uclass.o
>  obj-$(CONFIG_NET)      += eth_common.o
>  obj-$(CONFIG_CMD_LINK_LOCAL) += link_local.o
>  obj-$(CONFIG_NET)      += net.o
> diff --git a/net/mdio-mux-uclass.c b/net/mdio-mux-uclass.c
> new file mode 100644
> index 0000000000..e3fe12a531
> --- /dev/null
> +++ b/net/mdio-mux-uclass.c
> @@ -0,0 +1,232 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * (C) Copyright 2019
> + * Alex Marginean, NXP
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <miiphy.h>
> +#include <dm/device-internal.h>
> +#include <dm/uclass-internal.h>
> +#include <dm/lists.h>
> +
> +#define MDIO_MUX_CHILD_DRV_NAME        "mdio-mux-bus-drv"
> +
> +/**
> + * struct mdio_mux_perdev_priv - Per-device class data for MDIO MUX DM
> + *
> + * @parent_mdio: Parent DM MDIO device, this is called for actual MDIO I/O after
> + *               setting up the mux.  Typically this is a real MDIO device,
> + *               unless there are cascaded muxes.
> + * @selected:    Current child bus selection.  Defaults to -1
> + */
> +struct mdio_mux_perdev_priv {
> +       struct udevice *mdio_parent;
> +       int selected;
> +};
> +
> +/*
> + * This source file uses three types of devices, as follows:
> + * - mux is the hardware MDIO MUX which selects between the existing child MDIO
> + * buses, this is the device relevant for MDIO MUX class of drivers.
> + * - ch is a child MDIO bus, this is just a representation of an mux selection,

nits: a mux selection

> + * not a real piece of hardware.
> + * - mdio_parent is the actual MDIO bus called to perform reads/writes  after

nits: 2 spaces before "after"

> + * the MUX is configured.  Typically this is a real MDIO device, unless there
> + * are cascaded muxes.
> + */
> +

[snip]

Other than above,
Reviewed-by: Bin Meng <bmeng.cn at gmail.com>

Regards,
Bin


More information about the U-Boot mailing list