Commit d418f67e authored by Jakub Kicinski's avatar Jakub Kicinski

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.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 3c5290a2 32ecd22b
...@@ -828,7 +828,7 @@ static void felix_phylink_mac_config(struct dsa_switch *ds, int port, ...@@ -828,7 +828,7 @@ static void felix_phylink_mac_config(struct dsa_switch *ds, int port,
struct felix *felix = ocelot_to_felix(ocelot); struct felix *felix = ocelot_to_felix(ocelot);
struct dsa_port *dp = dsa_to_port(ds, port); 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); 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) ...@@ -1028,7 +1028,7 @@ static int felix_init_structs(struct felix *felix, int num_phys_ports)
res.start += felix->switch_base; res.start += felix->switch_base;
res.end += 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)) { if (IS_ERR(target)) {
dev_err(ocelot->dev, dev_err(ocelot->dev,
"Failed to map device memory space\n"); "Failed to map device memory space\n");
...@@ -1065,7 +1065,7 @@ static int felix_init_structs(struct felix *felix, int num_phys_ports) ...@@ -1065,7 +1065,7 @@ static int felix_init_structs(struct felix *felix, int num_phys_ports)
res.start += felix->switch_base; res.start += felix->switch_base;
res.end += 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)) { if (IS_ERR(target)) {
dev_err(ocelot->dev, dev_err(ocelot->dev,
"Failed to map memory space for port %d\n", "Failed to map memory space for port %d\n",
......
...@@ -25,8 +25,6 @@ struct felix_info { ...@@ -25,8 +25,6 @@ struct felix_info {
u16 vcap_pol_max; u16 vcap_pol_max;
u16 vcap_pol_base2; u16 vcap_pol_base2;
u16 vcap_pol_max2; u16 vcap_pol_max2;
int switch_pci_bar;
int imdio_pci_bar;
const struct ptp_clock_info *ptp_caps; const struct ptp_clock_info *ptp_caps;
/* Some Ocelot switches are integrated into the SoC without the /* Some Ocelot switches are integrated into the SoC without the
...@@ -52,6 +50,8 @@ struct felix_info { ...@@ -52,6 +50,8 @@ struct felix_info {
enum tc_setup_type type, void *type_data); enum tc_setup_type type, void *type_data);
void (*port_sched_speed_set)(struct ocelot *ocelot, int port, void (*port_sched_speed_set)(struct ocelot *ocelot, int port,
u32 speed); u32 speed);
struct regmap *(*init_regmap)(struct ocelot *ocelot,
struct resource *res);
}; };
extern const struct dsa_switch_ops felix_switch_ops; extern const struct dsa_switch_ops felix_switch_ops;
......
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#define VSC9959_TAS_GCL_ENTRY_MAX 63 #define VSC9959_TAS_GCL_ENTRY_MAX 63
#define VSC9959_VCAP_POLICER_BASE 63 #define VSC9959_VCAP_POLICER_BASE 63
#define VSC9959_VCAP_POLICER_MAX 383 #define VSC9959_VCAP_POLICER_MAX 383
#define VSC9959_SWITCH_PCI_BAR 4
#define VSC9959_IMDIO_PCI_BAR 0
static const u32 vsc9959_ana_regmap[] = { static const u32 vsc9959_ana_regmap[] = {
REG(ANA_ADVLEARN, 0x0089a0), REG(ANA_ADVLEARN, 0x0089a0),
...@@ -2230,8 +2232,6 @@ static const struct felix_info felix_info_vsc9959 = { ...@@ -2230,8 +2232,6 @@ static const struct felix_info felix_info_vsc9959 = {
.num_mact_rows = 2048, .num_mact_rows = 2048,
.num_ports = 6, .num_ports = 6,
.num_tx_queues = OCELOT_NUM_TC, .num_tx_queues = OCELOT_NUM_TC,
.switch_pci_bar = 4,
.imdio_pci_bar = 0,
.quirk_no_xtr_irq = true, .quirk_no_xtr_irq = true,
.ptp_caps = &vsc9959_ptp_caps, .ptp_caps = &vsc9959_ptp_caps,
.mdio_bus_alloc = vsc9959_mdio_bus_alloc, .mdio_bus_alloc = vsc9959_mdio_bus_alloc,
...@@ -2240,6 +2240,7 @@ static const struct felix_info felix_info_vsc9959 = { ...@@ -2240,6 +2240,7 @@ static const struct felix_info felix_info_vsc9959 = {
.prevalidate_phy_mode = vsc9959_prevalidate_phy_mode, .prevalidate_phy_mode = vsc9959_prevalidate_phy_mode,
.port_setup_tc = vsc9959_port_setup_tc, .port_setup_tc = vsc9959_port_setup_tc,
.port_sched_speed_set = vsc9959_sched_speed_set, .port_sched_speed_set = vsc9959_sched_speed_set,
.init_regmap = ocelot_regmap_init,
}; };
static irqreturn_t felix_irq_handler(int irq, void *data) static irqreturn_t felix_irq_handler(int irq, void *data)
...@@ -2290,10 +2291,8 @@ static int felix_pci_probe(struct pci_dev *pdev, ...@@ -2290,10 +2291,8 @@ static int felix_pci_probe(struct pci_dev *pdev,
ocelot->dev = &pdev->dev; ocelot->dev = &pdev->dev;
ocelot->num_flooding_pgids = OCELOT_NUM_TC; ocelot->num_flooding_pgids = OCELOT_NUM_TC;
felix->info = &felix_info_vsc9959; felix->info = &felix_info_vsc9959;
felix->switch_base = pci_resource_start(pdev, felix->switch_base = pci_resource_start(pdev, VSC9959_SWITCH_PCI_BAR);
felix->info->switch_pci_bar); felix->imdio_base = pci_resource_start(pdev, VSC9959_IMDIO_PCI_BAR);
felix->imdio_base = pci_resource_start(pdev,
felix->info->imdio_pci_bar);
pci_set_master(pdev); pci_set_master(pdev);
......
...@@ -1104,6 +1104,7 @@ static const struct felix_info seville_info_vsc9953 = { ...@@ -1104,6 +1104,7 @@ static const struct felix_info seville_info_vsc9953 = {
.mdio_bus_free = vsc9953_mdio_bus_free, .mdio_bus_free = vsc9953_mdio_bus_free,
.phylink_validate = vsc9953_phylink_validate, .phylink_validate = vsc9953_phylink_validate,
.prevalidate_phy_mode = vsc9953_prevalidate_phy_mode, .prevalidate_phy_mode = vsc9953_prevalidate_phy_mode,
.init_regmap = ocelot_regmap_init,
}; };
static int seville_probe(struct platform_device *pdev) static int seville_probe(struct platform_device *pdev)
......
...@@ -7,7 +7,8 @@ mscc_ocelot_switch_lib-y := \ ...@@ -7,7 +7,8 @@ mscc_ocelot_switch_lib-y := \
ocelot_vcap.o \ ocelot_vcap.o \
ocelot_flower.o \ ocelot_flower.o \
ocelot_ptp.o \ ocelot_ptp.o \
ocelot_devlink.o ocelot_devlink.o \
vsc7514_regs.o
mscc_ocelot_switch_lib-$(CONFIG_BRIDGE_MRP) += ocelot_mrp.o mscc_ocelot_switch_lib-$(CONFIG_BRIDGE_MRP) += ocelot_mrp.o
obj-$(CONFIG_MSCC_OCELOT_SWITCH) += mscc_ocelot.o obj-$(CONFIG_MSCC_OCELOT_SWITCH) += mscc_ocelot.o
mscc_ocelot-y := \ mscc_ocelot-y := \
......
This diff is collapsed.
This diff is collapsed.
/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
/*
* Microsemi Ocelot Switch driver
*
* Copyright (c) 2021 Innovative Advantage Inc.
*/
#ifndef VSC7514_REGS_H
#define VSC7514_REGS_H
extern const u32 vsc7514_ana_regmap[];
extern const u32 vsc7514_qs_regmap[];
extern const u32 vsc7514_qsys_regmap[];
extern const u32 vsc7514_rew_regmap[];
extern const u32 vsc7514_sys_regmap[];
extern const u32 vsc7514_vcap_regmap[];
extern const u32 vsc7514_ptp_regmap[];
extern const u32 vsc7514_dev_gmii_regmap[];
extern const struct vcap_field vsc7514_vcap_es0_keys[];
extern const struct vcap_field vsc7514_vcap_es0_actions[];
extern const struct vcap_field vsc7514_vcap_is1_keys[];
extern const struct vcap_field vsc7514_vcap_is1_actions[];
extern const struct vcap_field vsc7514_vcap_is2_keys[];
extern const struct vcap_field vsc7514_vcap_is2_actions[];
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment