From: Vladimir Oltean Now that each switch driver has its own dsa_switch_ops (currently a copy of ksz_switch_ops), we no longer need ksz_switch_ops and can remove it. Get to the driver-specific dsa_switch_ops through the ksz_chip_data structure. Reorder the alloc()/get_match_data() calls such as to have that pointer available. Signed-off-by: Vladimir Oltean Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz8863_smi.c | 8 ++-- drivers/net/dsa/microchip/ksz9477_i2c.c | 8 ++-- drivers/net/dsa/microchip/ksz_common.c | 67 ++------------------------------- drivers/net/dsa/microchip/ksz_common.h | 4 +- drivers/net/dsa/microchip/ksz_spi.c | 8 ++-- 5 files changed, 19 insertions(+), 76 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz8863_smi.c b/drivers/net/dsa/microchip/ksz8863_smi.c index a8bfcd917bf70..ba08d2cf8e99f 100644 --- a/drivers/net/dsa/microchip/ksz8863_smi.c +++ b/drivers/net/dsa/microchip/ksz8863_smi.c @@ -140,14 +140,14 @@ static int ksz8863_smi_probe(struct mdio_device *mdiodev) int ret; int i; - dev = ksz_switch_alloc(&mdiodev->dev, mdiodev); - if (!dev) - return -ENOMEM; - chip = device_get_match_data(ddev); if (!chip) return -EINVAL; + dev = ksz_switch_alloc(&mdiodev->dev, chip, mdiodev); + if (!dev) + return -ENOMEM; + for (i = 0; i < __KSZ_NUM_REGMAPS; i++) { rc = ksz8863_regmap_config[i]; rc.lock_arg = &dev->regmap_mutex; diff --git a/drivers/net/dsa/microchip/ksz9477_i2c.c b/drivers/net/dsa/microchip/ksz9477_i2c.c index a2beb27459f18..8e9d08f2e1d65 100644 --- a/drivers/net/dsa/microchip/ksz9477_i2c.c +++ b/drivers/net/dsa/microchip/ksz9477_i2c.c @@ -22,14 +22,14 @@ static int ksz9477_i2c_probe(struct i2c_client *i2c) struct ksz_device *dev; int i, ret; - dev = ksz_switch_alloc(&i2c->dev, i2c); - if (!dev) - return -ENOMEM; - chip = device_get_match_data(ddev); if (!chip) return -EINVAL; + dev = ksz_switch_alloc(&i2c->dev, chip, i2c); + if (!dev) + return -ENOMEM; + /* Save chip id to do special initialization when probing. */ dev->chip_id = chip->chip_id; for (i = 0; i < __KSZ_NUM_REGMAPS; i++) { diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c index e48b9d5c06301..37e575bf4e14d 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -4640,68 +4640,9 @@ int ksz_resume(struct dsa_switch *ds) return 0; } -static const struct dsa_switch_ops ksz_switch_ops = { - .get_tag_protocol = ksz_get_tag_protocol, - .connect_tag_protocol = ksz_connect_tag_protocol, - .get_phy_flags = ksz_get_phy_flags, - .setup = ksz_setup, - .teardown = ksz_teardown, - .phy_read = ksz_phy_read16, - .phy_write = ksz_phy_write16, - .phylink_get_caps = ksz_phylink_get_caps, - .port_setup = ksz_port_setup, - .set_ageing_time = ksz_set_ageing_time, - .get_strings = ksz_get_strings, - .get_ethtool_stats = ksz_get_ethtool_stats, - .get_sset_count = ksz_sset_count, - .port_bridge_join = ksz_port_bridge_join, - .port_bridge_leave = ksz_port_bridge_leave, - .port_hsr_join = ksz_hsr_join, - .port_hsr_leave = ksz_hsr_leave, - .port_set_mac_address = ksz_port_set_mac_address, - .port_stp_state_set = ksz_port_stp_state_set, - .port_teardown = ksz_port_teardown, - .port_pre_bridge_flags = ksz_port_pre_bridge_flags, - .port_bridge_flags = ksz_port_bridge_flags, - .port_fast_age = ksz_port_fast_age, - .port_vlan_filtering = ksz_port_vlan_filtering, - .port_vlan_add = ksz_port_vlan_add, - .port_vlan_del = ksz_port_vlan_del, - .port_fdb_dump = ksz_port_fdb_dump, - .port_fdb_add = ksz_port_fdb_add, - .port_fdb_del = ksz_port_fdb_del, - .port_mdb_add = ksz_port_mdb_add, - .port_mdb_del = ksz_port_mdb_del, - .port_mirror_add = ksz_port_mirror_add, - .port_mirror_del = ksz_port_mirror_del, - .get_stats64 = ksz_get_stats64, - .get_pause_stats = ksz_get_pause_stats, - .port_change_mtu = ksz_change_mtu, - .port_max_mtu = ksz_max_mtu, - .get_wol = ksz_get_wol, - .set_wol = ksz_set_wol, - .suspend = ksz_suspend, - .resume = ksz_resume, - .get_ts_info = ksz_get_ts_info, - .port_hwtstamp_get = ksz_hwtstamp_get, - .port_hwtstamp_set = ksz_hwtstamp_set, - .port_txtstamp = ksz_port_txtstamp, - .port_rxtstamp = ksz_port_rxtstamp, - .cls_flower_add = ksz_cls_flower_add, - .cls_flower_del = ksz_cls_flower_del, - .port_setup_tc = ksz_setup_tc, - .support_eee = ksz_support_eee, - .set_mac_eee = ksz_set_mac_eee, - .port_get_default_prio = ksz_port_get_default_prio, - .port_set_default_prio = ksz_port_set_default_prio, - .port_get_dscp_prio = ksz_port_get_dscp_prio, - .port_add_dscp_prio = ksz_port_add_dscp_prio, - .port_del_dscp_prio = ksz_port_del_dscp_prio, - .port_get_apptrust = ksz_port_get_apptrust, - .port_set_apptrust = ksz_port_set_apptrust, -}; - -struct ksz_device *ksz_switch_alloc(struct device *base, void *priv) +struct ksz_device *ksz_switch_alloc(struct device *base, + const struct ksz_chip_data *chip, + void *priv) { struct dsa_switch *ds; struct ksz_device *swdev; @@ -4712,7 +4653,7 @@ struct ksz_device *ksz_switch_alloc(struct device *base, void *priv) ds->dev = base; ds->num_ports = DSA_MAX_PORTS; - ds->ops = &ksz_switch_ops; + ds->ops = chip->switch_ops; swdev = devm_kzalloc(base, sizeof(*swdev), GFP_KERNEL); if (!swdev) diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/microchip/ksz_common.h index 125740deb5a21..37923a1c43d80 100644 --- a/drivers/net/dsa/microchip/ksz_common.h +++ b/drivers/net/dsa/microchip/ksz_common.h @@ -460,7 +460,9 @@ struct ksz_dev_ops { int (*pcs_create)(struct ksz_device *dev); }; -struct ksz_device *ksz_switch_alloc(struct device *base, void *priv); +struct ksz_device *ksz_switch_alloc(struct device *base, + const struct ksz_chip_data *chip, + void *priv); int ksz_switch_register(struct ksz_device *dev); void ksz_switch_remove(struct ksz_device *dev); int ksz_switch_suspend(struct device *dev); diff --git a/drivers/net/dsa/microchip/ksz_spi.c b/drivers/net/dsa/microchip/ksz_spi.c index d8001734b0574..373e9054947cb 100644 --- a/drivers/net/dsa/microchip/ksz_spi.c +++ b/drivers/net/dsa/microchip/ksz_spi.c @@ -143,14 +143,14 @@ static int ksz_spi_probe(struct spi_device *spi) struct ksz_device *dev; int i, ret = 0; - dev = ksz_switch_alloc(&spi->dev, spi); - if (!dev) - return -ENOMEM; - chip = device_get_match_data(ddev); if (!chip) return -EINVAL; + dev = ksz_switch_alloc(&spi->dev, chip, spi); + if (!dev) + return -ENOMEM; + /* Save chip id to do special initialization when probing. */ dev->chip_id = chip->chip_id; if (chip->chip_id == KSZ88X3_CHIP_ID) -- 2.53.0