On Mon, Oct 21, 2024 at 03:58:51PM +0200, Daniel Machon wrote: > Add compatible strings for the twelve lan969x SKU's (Stock Keeping Unit) > that we support, and verify that the devicetree target is supported by > the chip target. > > Each SKU supports different bandwidths and features (see [1] for > details). We want to be able to run a SKU with a lower bandwidth and/or > feature set, than what is supported by the actual chip. In order to > accomplish this we: > > - add new field sparx5->target_dt that reflects the target from the > devicetree (compatible string). > > - compare the devicetree target with the actual chip target. If the > bandwidth and features provided by the devicetree target is > supported by the chip, we approve - otherwise reject. > > - set the core clock and features based on the devicetree target > > [1] https://www.microchip.com/en-us/product/lan9698 > > Reviewed-by: Steen Hegelund <Steen.Hegelund@xxxxxxxxxxxxx> > Signed-off-by: Daniel Machon <daniel.machon@xxxxxxxxxxxxx> > --- > drivers/net/ethernet/microchip/sparx5/Makefile | 1 + > .../net/ethernet/microchip/sparx5/sparx5_main.c | 194 ++++++++++++++++++++- > .../net/ethernet/microchip/sparx5/sparx5_main.h | 1 + > 3 files changed, 193 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/ethernet/microchip/sparx5/Makefile b/drivers/net/ethernet/microchip/sparx5/Makefile > index 3435ca86dd70..8fe302415563 100644 > --- a/drivers/net/ethernet/microchip/sparx5/Makefile > +++ b/drivers/net/ethernet/microchip/sparx5/Makefile > @@ -19,3 +19,4 @@ sparx5-switch-$(CONFIG_DEBUG_FS) += sparx5_vcap_debugfs.o > # Provide include files > ccflags-y += -I$(srctree)/drivers/net/ethernet/microchip/vcap > ccflags-y += -I$(srctree)/drivers/net/ethernet/microchip/fdma > +ccflags-y += -I$(srctree)/drivers/net/ethernet/microchip/lan969x > diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_main.c b/drivers/net/ethernet/microchip/sparx5/sparx5_main.c > index 5c986c373b3e..edbe639d98c5 100644 > --- a/drivers/net/ethernet/microchip/sparx5/sparx5_main.c > +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_main.c > @@ -24,6 +24,8 @@ > #include <linux/types.h> > #include <linux/reset.h> > > +#include "lan969x.h" /* lan969x_desc */ > + > #include "sparx5_main_regs.h" > #include "sparx5_main.h" > #include "sparx5_port.h" > @@ -227,6 +229,168 @@ bool is_sparx5(struct sparx5 *sparx5) > } > } > > +/* Set the devicetree target based on the compatible string */ > +static int sparx5_set_target_dt(struct sparx5 *sparx5) > +{ > + struct device_node *node = sparx5->pdev->dev.of_node; > + > + if (is_sparx5(sparx5)) > + /* For Sparx5 the devicetree target is always the chip target */ > + sparx5->target_dt = sparx5->target_ct; > + else if (of_device_is_compatible(node, "microchip,lan9691-switch")) > + sparx5->target_dt = SPX5_TARGET_CT_LAN9691VAO; > + else if (of_device_is_compatible(node, "microchip,lan9692-switch")) > + sparx5->target_dt = SPX5_TARGET_CT_LAN9692VAO; > + else if (of_device_is_compatible(node, "microchip,lan9693-switch")) > + sparx5->target_dt = SPX5_TARGET_CT_LAN9693VAO; > + else if (of_device_is_compatible(node, "microchip,lan9694-switch")) > + sparx5->target_dt = SPX5_TARGET_CT_LAN9694; > + else if (of_device_is_compatible(node, "microchip,lan9695-switch")) > + sparx5->target_dt = SPX5_TARGET_CT_LAN9694TSN; > + else if (of_device_is_compatible(node, "microchip,lan9696-switch")) > + sparx5->target_dt = SPX5_TARGET_CT_LAN9696; > + else if (of_device_is_compatible(node, "microchip,lan9697-switch")) > + sparx5->target_dt = SPX5_TARGET_CT_LAN9696TSN; > + else if (of_device_is_compatible(node, "microchip,lan9698-switch")) > + sparx5->target_dt = SPX5_TARGET_CT_LAN9698; > + else if (of_device_is_compatible(node, "microchip,lan9699-switch")) > + sparx5->target_dt = SPX5_TARGET_CT_LAN9698TSN; > + else if (of_device_is_compatible(node, "microchip,lan969a-switch")) > + sparx5->target_dt = SPX5_TARGET_CT_LAN9694RED; > + else if (of_device_is_compatible(node, "microchip,lan969b-switch")) > + sparx5->target_dt = SPX5_TARGET_CT_LAN9696RED; > + else if (of_device_is_compatible(node, "microchip,lan969c-switch")) > + sparx5->target_dt = SPX5_TARGET_CT_LAN9698RED; > + else > + return -EINVAL; > + > + return 0; > +} > + > +/* Compare the devicetree target with the chip target. > + * Make sure the chip target supports the features and bandwidth requested > + * from the devicetree target. > + */ > +static int sparx5_verify_target(struct sparx5 *sparx5) > +{ > + switch (sparx5->target_dt) { > + case SPX5_TARGET_CT_7546: > + case SPX5_TARGET_CT_7549: > + case SPX5_TARGET_CT_7552: > + case SPX5_TARGET_CT_7556: > + case SPX5_TARGET_CT_7558: > + case SPX5_TARGET_CT_7546TSN: > + case SPX5_TARGET_CT_7549TSN: > + case SPX5_TARGET_CT_7552TSN: > + case SPX5_TARGET_CT_7556TSN: > + case SPX5_TARGET_CT_7558TSN: > + return 0; All this is weird. Why would you verify? You were matched, it cannot be mis-matching. > + case SPX5_TARGET_CT_LAN9698RED: > + if (sparx5->target_ct == SPX5_TARGET_CT_LAN9698RED) What is "ct"? sorry, all this code is a big no. Best regards, Krzysztof