[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