Commit d418f67e authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'prepare-ocelot-for-external-interface-control'

Colin Foster says:

====================
prepare ocelot for external interface control

This patch set is derived from an attempt to include external control
for a VSC751[1234] chip via SPI. That patch set has grown large and is
getting unwieldy for reviewers and the developers... me.

I'm breaking out the changes from that patch set. Some are trivial
  net: dsa: ocelot: remove unnecessary pci_bar variables
  net: dsa: ocelot: felix: Remove requirement for PCS in felix devices

some are required for SPI
  net: dsa: ocelot: felix: add interface for custom regmaps

and some are just to expose code to be shared
  net: mscc: ocelot: split register definitions to a separate file

The entirety of this patch set should have essentially no impact on the
system performance.
====================

Link: https://lore.kernel.org/r/20211207170030.1406601-1-colin.foster@in-advantage.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 3c5290a2 32ecd22b
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -828,7 +828,7 @@ static void felix_phylink_mac_config(struct dsa_switch *ds, int port,
	struct felix *felix = ocelot_to_felix(ocelot);
	struct dsa_port *dp = dsa_to_port(ds, port);

	if (felix->pcs[port])
	if (felix->pcs && felix->pcs[port])
		phylink_set_pcs(dp->pl, &felix->pcs[port]->pcs);
}

@@ -1028,7 +1028,7 @@ static int felix_init_structs(struct felix *felix, int num_phys_ports)
		res.start += felix->switch_base;
		res.end += felix->switch_base;

		target = ocelot_regmap_init(ocelot, &res);
		target = felix->info->init_regmap(ocelot, &res);
		if (IS_ERR(target)) {
			dev_err(ocelot->dev,
				"Failed to map device memory space\n");
@@ -1065,7 +1065,7 @@ static int felix_init_structs(struct felix *felix, int num_phys_ports)
		res.start += felix->switch_base;
		res.end += felix->switch_base;

		target = ocelot_regmap_init(ocelot, &res);
		target = felix->info->init_regmap(ocelot, &res);
		if (IS_ERR(target)) {
			dev_err(ocelot->dev,
				"Failed to map memory space for port %d\n",
+2 −2
Original line number Diff line number Diff line
@@ -25,8 +25,6 @@ struct felix_info {
	u16				vcap_pol_max;
	u16				vcap_pol_base2;
	u16				vcap_pol_max2;
	int				switch_pci_bar;
	int				imdio_pci_bar;
	const struct ptp_clock_info	*ptp_caps;

	/* Some Ocelot switches are integrated into the SoC without the
@@ -52,6 +50,8 @@ struct felix_info {
				 enum tc_setup_type type, void *type_data);
	void	(*port_sched_speed_set)(struct ocelot *ocelot, int port,
					u32 speed);
	struct regmap *(*init_regmap)(struct ocelot *ocelot,
				      struct resource *res);
};

extern const struct dsa_switch_ops felix_switch_ops;
+5 −6
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@
#define VSC9959_TAS_GCL_ENTRY_MAX	63
#define VSC9959_VCAP_POLICER_BASE	63
#define VSC9959_VCAP_POLICER_MAX	383
#define VSC9959_SWITCH_PCI_BAR		4
#define VSC9959_IMDIO_PCI_BAR		0

static const u32 vsc9959_ana_regmap[] = {
	REG(ANA_ADVLEARN,			0x0089a0),
@@ -2230,8 +2232,6 @@ static const struct felix_info felix_info_vsc9959 = {
	.num_mact_rows		= 2048,
	.num_ports		= 6,
	.num_tx_queues		= OCELOT_NUM_TC,
	.switch_pci_bar		= 4,
	.imdio_pci_bar		= 0,
	.quirk_no_xtr_irq	= true,
	.ptp_caps		= &vsc9959_ptp_caps,
	.mdio_bus_alloc		= vsc9959_mdio_bus_alloc,
@@ -2240,6 +2240,7 @@ static const struct felix_info felix_info_vsc9959 = {
	.prevalidate_phy_mode	= vsc9959_prevalidate_phy_mode,
	.port_setup_tc		= vsc9959_port_setup_tc,
	.port_sched_speed_set	= vsc9959_sched_speed_set,
	.init_regmap		= ocelot_regmap_init,
};

static irqreturn_t felix_irq_handler(int irq, void *data)
@@ -2290,10 +2291,8 @@ static int felix_pci_probe(struct pci_dev *pdev,
	ocelot->dev = &pdev->dev;
	ocelot->num_flooding_pgids = OCELOT_NUM_TC;
	felix->info = &felix_info_vsc9959;
	felix->switch_base = pci_resource_start(pdev,
						felix->info->switch_pci_bar);
	felix->imdio_base = pci_resource_start(pdev,
					       felix->info->imdio_pci_bar);
	felix->switch_base = pci_resource_start(pdev, VSC9959_SWITCH_PCI_BAR);
	felix->imdio_base = pci_resource_start(pdev, VSC9959_IMDIO_PCI_BAR);

	pci_set_master(pdev);

+1 −0
Original line number Diff line number Diff line
@@ -1104,6 +1104,7 @@ static const struct felix_info seville_info_vsc9953 = {
	.mdio_bus_free		= vsc9953_mdio_bus_free,
	.phylink_validate	= vsc9953_phylink_validate,
	.prevalidate_phy_mode	= vsc9953_prevalidate_phy_mode,
	.init_regmap		= ocelot_regmap_init,
};

static int seville_probe(struct platform_device *pdev)
+2 −1
Original line number Diff line number Diff line
@@ -7,7 +7,8 @@ mscc_ocelot_switch_lib-y := \
	ocelot_vcap.o \
	ocelot_flower.o \
	ocelot_ptp.o \
	ocelot_devlink.o
	ocelot_devlink.o \
	vsc7514_regs.o
mscc_ocelot_switch_lib-$(CONFIG_BRIDGE_MRP) += ocelot_mrp.o
obj-$(CONFIG_MSCC_OCELOT_SWITCH) += mscc_ocelot.o
mscc_ocelot-y := \
Loading