0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/list.h>
0009 #include <linux/module.h>
0010 #include <linux/netdevice.h>
0011 #include <linux/interrupt.h>
0012 #include <linux/platform_device.h>
0013 #include <linux/phy.h>
0014 #include <linux/phy_fixed.h>
0015 #include <linux/phylink.h>
0016 #include <linux/mii.h>
0017 #include <linux/clk.h>
0018 #include <linux/of.h>
0019 #include <linux/of_irq.h>
0020 #include <linux/of_address.h>
0021 #include <linux/of_net.h>
0022 #include <linux/of_mdio.h>
0023 #include <net/dsa.h>
0024 #include <linux/ethtool.h>
0025 #include <linux/if_bridge.h>
0026 #include <linux/brcmphy.h>
0027 #include <linux/etherdevice.h>
0028 #include <linux/platform_data/b53.h>
0029
0030 #include "bcm_sf2.h"
0031 #include "bcm_sf2_regs.h"
0032 #include "b53/b53_priv.h"
0033 #include "b53/b53_regs.h"
0034
0035 static u16 bcm_sf2_reg_rgmii_cntrl(struct bcm_sf2_priv *priv, int port)
0036 {
0037 switch (priv->type) {
0038 case BCM4908_DEVICE_ID:
0039 switch (port) {
0040 case 7:
0041 return REG_RGMII_11_CNTRL;
0042 default:
0043 break;
0044 }
0045 break;
0046 default:
0047 switch (port) {
0048 case 0:
0049 return REG_RGMII_0_CNTRL;
0050 case 1:
0051 return REG_RGMII_1_CNTRL;
0052 case 2:
0053 return REG_RGMII_2_CNTRL;
0054 default:
0055 break;
0056 }
0057 }
0058
0059 WARN_ONCE(1, "Unsupported port %d\n", port);
0060
0061
0062 return REG_SWITCH_STATUS;
0063 }
0064
0065 static u16 bcm_sf2_reg_led_base(struct bcm_sf2_priv *priv, int port)
0066 {
0067 switch (port) {
0068 case 0:
0069 return REG_LED_0_CNTRL;
0070 case 1:
0071 return REG_LED_1_CNTRL;
0072 case 2:
0073 return REG_LED_2_CNTRL;
0074 }
0075
0076 switch (priv->type) {
0077 case BCM4908_DEVICE_ID:
0078 switch (port) {
0079 case 3:
0080 return REG_LED_3_CNTRL;
0081 case 7:
0082 return REG_LED_4_CNTRL;
0083 default:
0084 break;
0085 }
0086 break;
0087 default:
0088 break;
0089 }
0090
0091 WARN_ONCE(1, "Unsupported port %d\n", port);
0092
0093
0094 return REG_SWITCH_STATUS;
0095 }
0096
0097
0098 static unsigned int bcm_sf2_num_active_ports(struct dsa_switch *ds)
0099 {
0100 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0101 unsigned int port, count = 0;
0102
0103 for (port = 0; port < ds->num_ports; port++) {
0104 if (dsa_is_cpu_port(ds, port))
0105 continue;
0106 if (priv->port_sts[port].enabled)
0107 count++;
0108 }
0109
0110 return count;
0111 }
0112
0113 static void bcm_sf2_recalc_clock(struct dsa_switch *ds)
0114 {
0115 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0116 unsigned long new_rate;
0117 unsigned int ports_active;
0118
0119 static const unsigned long rate_table[] = {
0120 59220000,
0121 60820000,
0122 62500000,
0123 62500000,
0124 };
0125
0126 ports_active = bcm_sf2_num_active_ports(ds);
0127 if (ports_active == 0 || !priv->clk_mdiv)
0128 return;
0129
0130
0131
0132
0133 if (ports_active > ARRAY_SIZE(rate_table))
0134 new_rate = 90000000;
0135 else
0136 new_rate = rate_table[ports_active - 1];
0137 clk_set_rate(priv->clk_mdiv, new_rate);
0138 }
0139
0140 static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port)
0141 {
0142 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0143 unsigned int i;
0144 u32 reg, offset;
0145
0146
0147 reg = core_readl(priv, CORE_MEM_PSM_VDD_CTRL);
0148 reg &= ~P_TXQ_PSM_VDD(port);
0149 core_writel(priv, reg, CORE_MEM_PSM_VDD_CTRL);
0150
0151
0152 core_writel(priv, SW_FWDG_EN, CORE_SWMODE);
0153
0154
0155 reg = core_readl(priv, CORE_SWITCH_CTRL);
0156 reg |= MII_DUMB_FWDG_EN;
0157 core_writel(priv, reg, CORE_SWITCH_CTRL);
0158
0159
0160
0161
0162 reg = core_readl(priv, CORE_PORT_TC2_QOS_MAP_PORT(port));
0163 for (i = 0; i < SF2_NUM_EGRESS_QUEUES; i++)
0164 reg |= i << (PRT_TO_QID_SHIFT * i);
0165 core_writel(priv, reg, CORE_PORT_TC2_QOS_MAP_PORT(port));
0166
0167 b53_brcm_hdr_setup(ds, port);
0168
0169 if (port == 8) {
0170 if (priv->type == BCM4908_DEVICE_ID ||
0171 priv->type == BCM7445_DEVICE_ID)
0172 offset = CORE_STS_OVERRIDE_IMP;
0173 else
0174 offset = CORE_STS_OVERRIDE_IMP2;
0175
0176
0177 reg = core_readl(priv, offset);
0178 reg |= (MII_SW_OR | LINK_STS);
0179 if (priv->type == BCM4908_DEVICE_ID)
0180 reg |= GMII_SPEED_UP_2G;
0181 else
0182 reg &= ~GMII_SPEED_UP_2G;
0183 core_writel(priv, reg, offset);
0184
0185
0186 reg = core_readl(priv, CORE_IMP_CTL);
0187 reg |= (RX_BCST_EN | RX_MCST_EN | RX_UCST_EN);
0188 reg &= ~(RX_DIS | TX_DIS);
0189 core_writel(priv, reg, CORE_IMP_CTL);
0190 } else {
0191 reg = core_readl(priv, CORE_G_PCTL_PORT(port));
0192 reg &= ~(RX_DIS | TX_DIS);
0193 core_writel(priv, reg, CORE_G_PCTL_PORT(port));
0194 }
0195
0196 priv->port_sts[port].enabled = true;
0197 }
0198
0199 static void bcm_sf2_gphy_enable_set(struct dsa_switch *ds, bool enable)
0200 {
0201 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0202 u32 reg;
0203
0204 reg = reg_readl(priv, REG_SPHY_CNTRL);
0205 if (enable) {
0206 reg |= PHY_RESET;
0207 reg &= ~(EXT_PWR_DOWN | IDDQ_BIAS | IDDQ_GLOBAL_PWR | CK25_DIS);
0208 reg_writel(priv, reg, REG_SPHY_CNTRL);
0209 udelay(21);
0210 reg = reg_readl(priv, REG_SPHY_CNTRL);
0211 reg &= ~PHY_RESET;
0212 } else {
0213 reg |= EXT_PWR_DOWN | IDDQ_BIAS | PHY_RESET;
0214 reg_writel(priv, reg, REG_SPHY_CNTRL);
0215 mdelay(1);
0216 reg |= CK25_DIS;
0217 }
0218 reg_writel(priv, reg, REG_SPHY_CNTRL);
0219
0220
0221 if (!enable) {
0222 u16 led_ctrl = bcm_sf2_reg_led_base(priv, 0);
0223
0224 if (priv->type == BCM7278_DEVICE_ID ||
0225 priv->type == BCM7445_DEVICE_ID) {
0226 reg = reg_led_readl(priv, led_ctrl, 0);
0227 reg |= LED_CNTRL_SPDLNK_SRC_SEL;
0228 reg_led_writel(priv, reg, led_ctrl, 0);
0229 }
0230 }
0231 }
0232
0233 static inline void bcm_sf2_port_intr_enable(struct bcm_sf2_priv *priv,
0234 int port)
0235 {
0236 unsigned int off;
0237
0238 switch (port) {
0239 case 7:
0240 off = P7_IRQ_OFF;
0241 break;
0242 case 0:
0243
0244 intrl2_0_mask_clear(priv, P_IRQ_MASK(P0_IRQ_OFF));
0245 return;
0246 default:
0247 off = P_IRQ_OFF(port);
0248 break;
0249 }
0250
0251 intrl2_1_mask_clear(priv, P_IRQ_MASK(off));
0252 }
0253
0254 static inline void bcm_sf2_port_intr_disable(struct bcm_sf2_priv *priv,
0255 int port)
0256 {
0257 unsigned int off;
0258
0259 switch (port) {
0260 case 7:
0261 off = P7_IRQ_OFF;
0262 break;
0263 case 0:
0264
0265 intrl2_0_mask_set(priv, P_IRQ_MASK(P0_IRQ_OFF));
0266 intrl2_0_writel(priv, P_IRQ_MASK(P0_IRQ_OFF), INTRL2_CPU_CLEAR);
0267 return;
0268 default:
0269 off = P_IRQ_OFF(port);
0270 break;
0271 }
0272
0273 intrl2_1_mask_set(priv, P_IRQ_MASK(off));
0274 intrl2_1_writel(priv, P_IRQ_MASK(off), INTRL2_CPU_CLEAR);
0275 }
0276
0277 static int bcm_sf2_port_setup(struct dsa_switch *ds, int port,
0278 struct phy_device *phy)
0279 {
0280 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0281 unsigned int i;
0282 u32 reg;
0283
0284 if (!dsa_is_user_port(ds, port))
0285 return 0;
0286
0287 priv->port_sts[port].enabled = true;
0288
0289 bcm_sf2_recalc_clock(ds);
0290
0291
0292 reg = core_readl(priv, CORE_MEM_PSM_VDD_CTRL);
0293 reg &= ~P_TXQ_PSM_VDD(port);
0294 core_writel(priv, reg, CORE_MEM_PSM_VDD_CTRL);
0295
0296
0297 if (priv->brcm_tag_mask & BIT(port))
0298 b53_brcm_hdr_setup(ds, port);
0299
0300
0301
0302
0303 reg = core_readl(priv, CORE_PORT_TC2_QOS_MAP_PORT(port));
0304 for (i = 0; i < SF2_NUM_EGRESS_QUEUES; i++)
0305 reg |= i << (PRT_TO_QID_SHIFT * i);
0306 core_writel(priv, reg, CORE_PORT_TC2_QOS_MAP_PORT(port));
0307
0308
0309 if (priv->int_phy_mask & 1 << port && priv->hw_params.num_gphy == 1) {
0310 bcm_sf2_gphy_enable_set(ds, true);
0311 if (phy) {
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321 phy->state = PHY_READY;
0322 phy_init_hw(phy);
0323 }
0324 }
0325
0326
0327 if (port == priv->moca_port)
0328 bcm_sf2_port_intr_enable(priv, port);
0329
0330
0331 core_writel(priv, 32, CORE_TXQ_THD_PAUSE_QN_PORT(port));
0332
0333
0334 for (i = 0; i < SF2_NUM_EGRESS_QUEUES; i++) {
0335 reg = acb_readl(priv, ACB_QUEUE_CFG(port *
0336 SF2_NUM_EGRESS_QUEUES + i));
0337 reg &= ~XOFF_THRESHOLD_MASK;
0338 reg |= 24;
0339 acb_writel(priv, reg, ACB_QUEUE_CFG(port *
0340 SF2_NUM_EGRESS_QUEUES + i));
0341 }
0342
0343 return b53_enable_port(ds, port, phy);
0344 }
0345
0346 static void bcm_sf2_port_disable(struct dsa_switch *ds, int port)
0347 {
0348 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0349 u32 reg;
0350
0351
0352 if (priv->wol_ports_mask & (1 << port)) {
0353 reg = core_readl(priv, CORE_DIS_LEARN);
0354 reg |= BIT(port);
0355 core_writel(priv, reg, CORE_DIS_LEARN);
0356 return;
0357 }
0358
0359 if (port == priv->moca_port)
0360 bcm_sf2_port_intr_disable(priv, port);
0361
0362 if (priv->int_phy_mask & 1 << port && priv->hw_params.num_gphy == 1)
0363 bcm_sf2_gphy_enable_set(ds, false);
0364
0365 b53_disable_port(ds, port);
0366
0367
0368 reg = core_readl(priv, CORE_MEM_PSM_VDD_CTRL);
0369 reg |= P_TXQ_PSM_VDD(port);
0370 core_writel(priv, reg, CORE_MEM_PSM_VDD_CTRL);
0371
0372 priv->port_sts[port].enabled = false;
0373
0374 bcm_sf2_recalc_clock(ds);
0375 }
0376
0377
0378 static int bcm_sf2_sw_indir_rw(struct bcm_sf2_priv *priv, int op, int addr,
0379 int regnum, u16 val)
0380 {
0381 int ret = 0;
0382 u32 reg;
0383
0384 reg = reg_readl(priv, REG_SWITCH_CNTRL);
0385 reg |= MDIO_MASTER_SEL;
0386 reg_writel(priv, reg, REG_SWITCH_CNTRL);
0387
0388
0389 reg = 0x70;
0390 reg <<= 2;
0391 core_writel(priv, addr, reg);
0392
0393
0394 reg = 0x80 << 8 | regnum << 1;
0395 reg <<= 2;
0396
0397 if (op)
0398 ret = core_readl(priv, reg);
0399 else
0400 core_writel(priv, val, reg);
0401
0402 reg = reg_readl(priv, REG_SWITCH_CNTRL);
0403 reg &= ~MDIO_MASTER_SEL;
0404 reg_writel(priv, reg, REG_SWITCH_CNTRL);
0405
0406 return ret & 0xffff;
0407 }
0408
0409 static int bcm_sf2_sw_mdio_read(struct mii_bus *bus, int addr, int regnum)
0410 {
0411 struct bcm_sf2_priv *priv = bus->priv;
0412
0413
0414
0415
0416 if (addr == BRCM_PSEUDO_PHY_ADDR && priv->indir_phy_mask & BIT(addr))
0417 return bcm_sf2_sw_indir_rw(priv, 1, addr, regnum, 0);
0418 else
0419 return mdiobus_read_nested(priv->master_mii_bus, addr, regnum);
0420 }
0421
0422 static int bcm_sf2_sw_mdio_write(struct mii_bus *bus, int addr, int regnum,
0423 u16 val)
0424 {
0425 struct bcm_sf2_priv *priv = bus->priv;
0426
0427
0428
0429
0430 if (addr == BRCM_PSEUDO_PHY_ADDR && priv->indir_phy_mask & BIT(addr))
0431 return bcm_sf2_sw_indir_rw(priv, 0, addr, regnum, val);
0432 else
0433 return mdiobus_write_nested(priv->master_mii_bus, addr,
0434 regnum, val);
0435 }
0436
0437 static irqreturn_t bcm_sf2_switch_0_isr(int irq, void *dev_id)
0438 {
0439 struct dsa_switch *ds = dev_id;
0440 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0441
0442 priv->irq0_stat = intrl2_0_readl(priv, INTRL2_CPU_STATUS) &
0443 ~priv->irq0_mask;
0444 intrl2_0_writel(priv, priv->irq0_stat, INTRL2_CPU_CLEAR);
0445
0446 return IRQ_HANDLED;
0447 }
0448
0449 static irqreturn_t bcm_sf2_switch_1_isr(int irq, void *dev_id)
0450 {
0451 struct dsa_switch *ds = dev_id;
0452 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0453
0454 priv->irq1_stat = intrl2_1_readl(priv, INTRL2_CPU_STATUS) &
0455 ~priv->irq1_mask;
0456 intrl2_1_writel(priv, priv->irq1_stat, INTRL2_CPU_CLEAR);
0457
0458 if (priv->irq1_stat & P_LINK_UP_IRQ(P7_IRQ_OFF)) {
0459 priv->port_sts[7].link = true;
0460 dsa_port_phylink_mac_change(ds, 7, true);
0461 }
0462 if (priv->irq1_stat & P_LINK_DOWN_IRQ(P7_IRQ_OFF)) {
0463 priv->port_sts[7].link = false;
0464 dsa_port_phylink_mac_change(ds, 7, false);
0465 }
0466
0467 return IRQ_HANDLED;
0468 }
0469
0470 static int bcm_sf2_sw_rst(struct bcm_sf2_priv *priv)
0471 {
0472 unsigned int timeout = 1000;
0473 u32 reg;
0474 int ret;
0475
0476
0477
0478
0479 if (priv->type == BCM7278_DEVICE_ID) {
0480 ret = reset_control_assert(priv->rcdev);
0481 if (ret)
0482 return ret;
0483
0484 return reset_control_deassert(priv->rcdev);
0485 }
0486
0487 reg = core_readl(priv, CORE_WATCHDOG_CTRL);
0488 reg |= SOFTWARE_RESET | EN_CHIP_RST | EN_SW_RESET;
0489 core_writel(priv, reg, CORE_WATCHDOG_CTRL);
0490
0491 do {
0492 reg = core_readl(priv, CORE_WATCHDOG_CTRL);
0493 if (!(reg & SOFTWARE_RESET))
0494 break;
0495
0496 usleep_range(1000, 2000);
0497 } while (timeout-- > 0);
0498
0499 if (timeout == 0)
0500 return -ETIMEDOUT;
0501
0502 return 0;
0503 }
0504
0505 static void bcm_sf2_crossbar_setup(struct bcm_sf2_priv *priv)
0506 {
0507 struct device *dev = priv->dev->ds->dev;
0508 int shift;
0509 u32 mask;
0510 u32 reg;
0511 int i;
0512
0513 mask = BIT(priv->num_crossbar_int_ports) - 1;
0514
0515 reg = reg_readl(priv, REG_CROSSBAR);
0516 switch (priv->type) {
0517 case BCM4908_DEVICE_ID:
0518 shift = CROSSBAR_BCM4908_INT_P7 * priv->num_crossbar_int_ports;
0519 reg &= ~(mask << shift);
0520 if (0)
0521 reg |= CROSSBAR_BCM4908_EXT_SERDES << shift;
0522 else if (priv->int_phy_mask & BIT(7))
0523 reg |= CROSSBAR_BCM4908_EXT_GPHY4 << shift;
0524 else if (phy_interface_mode_is_rgmii(priv->port_sts[7].mode))
0525 reg |= CROSSBAR_BCM4908_EXT_RGMII << shift;
0526 else if (WARN(1, "Invalid port mode\n"))
0527 return;
0528 break;
0529 default:
0530 return;
0531 }
0532 reg_writel(priv, reg, REG_CROSSBAR);
0533
0534 reg = reg_readl(priv, REG_CROSSBAR);
0535 for (i = 0; i < priv->num_crossbar_int_ports; i++) {
0536 shift = i * priv->num_crossbar_int_ports;
0537
0538 dev_dbg(dev, "crossbar int port #%d - ext port #%d\n", i,
0539 (reg >> shift) & mask);
0540 }
0541 }
0542
0543 static void bcm_sf2_intr_disable(struct bcm_sf2_priv *priv)
0544 {
0545 intrl2_0_mask_set(priv, 0xffffffff);
0546 intrl2_0_writel(priv, 0xffffffff, INTRL2_CPU_CLEAR);
0547 intrl2_1_mask_set(priv, 0xffffffff);
0548 intrl2_1_writel(priv, 0xffffffff, INTRL2_CPU_CLEAR);
0549 }
0550
0551 static void bcm_sf2_identify_ports(struct bcm_sf2_priv *priv,
0552 struct device_node *dn)
0553 {
0554 struct device *dev = priv->dev->ds->dev;
0555 struct bcm_sf2_port_status *port_st;
0556 struct device_node *port;
0557 unsigned int port_num;
0558 struct property *prop;
0559 int err;
0560
0561 priv->moca_port = -1;
0562
0563 for_each_available_child_of_node(dn, port) {
0564 if (of_property_read_u32(port, "reg", &port_num))
0565 continue;
0566
0567 if (port_num >= DSA_MAX_PORTS) {
0568 dev_err(dev, "Invalid port number %d\n", port_num);
0569 continue;
0570 }
0571
0572 port_st = &priv->port_sts[port_num];
0573
0574
0575
0576
0577
0578
0579 err = of_get_phy_mode(port, &port_st->mode);
0580 if (err)
0581 continue;
0582
0583 if (port_st->mode == PHY_INTERFACE_MODE_INTERNAL)
0584 priv->int_phy_mask |= 1 << port_num;
0585
0586 if (port_st->mode == PHY_INTERFACE_MODE_MOCA)
0587 priv->moca_port = port_num;
0588
0589 if (of_property_read_bool(port, "brcm,use-bcm-hdr"))
0590 priv->brcm_tag_mask |= 1 << port_num;
0591
0592
0593
0594
0595
0596 if (port_num == 5 && priv->type == BCM7278_DEVICE_ID) {
0597 prop = of_find_property(port, "ethernet", NULL);
0598 if (prop)
0599 of_remove_property(port, prop);
0600 }
0601 }
0602 }
0603
0604 static int bcm_sf2_mdio_register(struct dsa_switch *ds)
0605 {
0606 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0607 struct device_node *dn, *child;
0608 struct phy_device *phydev;
0609 struct property *prop;
0610 static int index;
0611 int err, reg;
0612
0613
0614 dn = of_find_compatible_node(NULL, NULL, "brcm,unimac-mdio");
0615 priv->master_mii_bus = of_mdio_find_bus(dn);
0616 if (!priv->master_mii_bus) {
0617 of_node_put(dn);
0618 return -EPROBE_DEFER;
0619 }
0620
0621 get_device(&priv->master_mii_bus->dev);
0622 priv->master_mii_dn = dn;
0623
0624 priv->slave_mii_bus = mdiobus_alloc();
0625 if (!priv->slave_mii_bus) {
0626 of_node_put(dn);
0627 return -ENOMEM;
0628 }
0629
0630 priv->slave_mii_bus->priv = priv;
0631 priv->slave_mii_bus->name = "sf2 slave mii";
0632 priv->slave_mii_bus->read = bcm_sf2_sw_mdio_read;
0633 priv->slave_mii_bus->write = bcm_sf2_sw_mdio_write;
0634 snprintf(priv->slave_mii_bus->id, MII_BUS_ID_SIZE, "sf2-%d",
0635 index++);
0636 priv->slave_mii_bus->dev.of_node = dn;
0637
0638
0639
0640
0641
0642
0643
0644
0645
0646
0647
0648 if (of_machine_is_compatible("brcm,bcm7445d0"))
0649 priv->indir_phy_mask |= (1 << BRCM_PSEUDO_PHY_ADDR) | (1 << 0);
0650 else
0651 priv->indir_phy_mask = 0;
0652
0653 ds->phys_mii_mask = priv->indir_phy_mask;
0654 ds->slave_mii_bus = priv->slave_mii_bus;
0655 priv->slave_mii_bus->parent = ds->dev->parent;
0656 priv->slave_mii_bus->phy_mask = ~priv->indir_phy_mask;
0657
0658
0659
0660
0661
0662 for_each_available_child_of_node(dn, child) {
0663 if (of_property_read_u32(child, "reg", ®) ||
0664 reg >= PHY_MAX_ADDR)
0665 continue;
0666
0667 if (!(priv->indir_phy_mask & BIT(reg)))
0668 continue;
0669
0670 prop = of_find_property(child, "phandle", NULL);
0671 if (prop)
0672 of_remove_property(child, prop);
0673
0674 prop = of_find_property(child, "linux,phandle", NULL);
0675 if (prop)
0676 of_remove_property(child, prop);
0677
0678 phydev = of_phy_find_device(child);
0679 if (phydev)
0680 phy_device_remove(phydev);
0681 }
0682
0683 err = mdiobus_register(priv->slave_mii_bus);
0684 if (err && dn) {
0685 mdiobus_free(priv->slave_mii_bus);
0686 of_node_put(dn);
0687 }
0688
0689 return err;
0690 }
0691
0692 static void bcm_sf2_mdio_unregister(struct bcm_sf2_priv *priv)
0693 {
0694 mdiobus_unregister(priv->slave_mii_bus);
0695 mdiobus_free(priv->slave_mii_bus);
0696 of_node_put(priv->master_mii_dn);
0697 }
0698
0699 static u32 bcm_sf2_sw_get_phy_flags(struct dsa_switch *ds, int port)
0700 {
0701 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0702
0703
0704
0705
0706
0707 if (priv->int_phy_mask & BIT(port))
0708 return priv->hw_params.gphy_rev;
0709 else
0710 return PHY_BRCM_AUTO_PWRDWN_ENABLE |
0711 PHY_BRCM_DIS_TXCRXC_NOENRGY |
0712 PHY_BRCM_IDDQ_SUSPEND;
0713 }
0714
0715 static void bcm_sf2_sw_get_caps(struct dsa_switch *ds, int port,
0716 struct phylink_config *config)
0717 {
0718 unsigned long *interfaces = config->supported_interfaces;
0719 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0720
0721 if (priv->int_phy_mask & BIT(port)) {
0722 __set_bit(PHY_INTERFACE_MODE_INTERNAL, interfaces);
0723 } else if (priv->moca_port == port) {
0724 __set_bit(PHY_INTERFACE_MODE_MOCA, interfaces);
0725 } else {
0726 __set_bit(PHY_INTERFACE_MODE_MII, interfaces);
0727 __set_bit(PHY_INTERFACE_MODE_REVMII, interfaces);
0728 __set_bit(PHY_INTERFACE_MODE_GMII, interfaces);
0729 phy_interface_set_rgmii(interfaces);
0730 }
0731
0732 config->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
0733 MAC_10 | MAC_100 | MAC_1000;
0734 }
0735
0736 static void bcm_sf2_sw_mac_config(struct dsa_switch *ds, int port,
0737 unsigned int mode,
0738 const struct phylink_link_state *state)
0739 {
0740 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0741 u32 id_mode_dis = 0, port_mode;
0742 u32 reg_rgmii_ctrl;
0743 u32 reg;
0744
0745 if (port == core_readl(priv, CORE_IMP0_PRT_ID))
0746 return;
0747
0748 switch (state->interface) {
0749 case PHY_INTERFACE_MODE_RGMII:
0750 id_mode_dis = 1;
0751 fallthrough;
0752 case PHY_INTERFACE_MODE_RGMII_TXID:
0753 port_mode = EXT_GPHY;
0754 break;
0755 case PHY_INTERFACE_MODE_MII:
0756 port_mode = EXT_EPHY;
0757 break;
0758 case PHY_INTERFACE_MODE_REVMII:
0759 port_mode = EXT_REVMII;
0760 break;
0761 default:
0762
0763 return;
0764 }
0765
0766 reg_rgmii_ctrl = bcm_sf2_reg_rgmii_cntrl(priv, port);
0767
0768
0769
0770
0771 reg = reg_readl(priv, reg_rgmii_ctrl);
0772 reg &= ~ID_MODE_DIS;
0773 reg &= ~(PORT_MODE_MASK << PORT_MODE_SHIFT);
0774
0775 reg |= port_mode;
0776 if (id_mode_dis)
0777 reg |= ID_MODE_DIS;
0778
0779 reg_writel(priv, reg, reg_rgmii_ctrl);
0780 }
0781
0782 static void bcm_sf2_sw_mac_link_set(struct dsa_switch *ds, int port,
0783 phy_interface_t interface, bool link)
0784 {
0785 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0786 u32 reg_rgmii_ctrl;
0787 u32 reg;
0788
0789 if (!phy_interface_mode_is_rgmii(interface) &&
0790 interface != PHY_INTERFACE_MODE_MII &&
0791 interface != PHY_INTERFACE_MODE_REVMII)
0792 return;
0793
0794 reg_rgmii_ctrl = bcm_sf2_reg_rgmii_cntrl(priv, port);
0795
0796
0797 reg = reg_readl(priv, reg_rgmii_ctrl);
0798 if (link)
0799 reg |= RGMII_MODE_EN;
0800 else
0801 reg &= ~RGMII_MODE_EN;
0802 reg_writel(priv, reg, reg_rgmii_ctrl);
0803 }
0804
0805 static void bcm_sf2_sw_mac_link_down(struct dsa_switch *ds, int port,
0806 unsigned int mode,
0807 phy_interface_t interface)
0808 {
0809 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0810 u32 reg, offset;
0811
0812 if (priv->wol_ports_mask & BIT(port))
0813 return;
0814
0815 if (port != core_readl(priv, CORE_IMP0_PRT_ID)) {
0816 if (priv->type == BCM4908_DEVICE_ID ||
0817 priv->type == BCM7445_DEVICE_ID)
0818 offset = CORE_STS_OVERRIDE_GMIIP_PORT(port);
0819 else
0820 offset = CORE_STS_OVERRIDE_GMIIP2_PORT(port);
0821
0822 reg = core_readl(priv, offset);
0823 reg &= ~LINK_STS;
0824 core_writel(priv, reg, offset);
0825 }
0826
0827 bcm_sf2_sw_mac_link_set(ds, port, interface, false);
0828 }
0829
0830 static void bcm_sf2_sw_mac_link_up(struct dsa_switch *ds, int port,
0831 unsigned int mode,
0832 phy_interface_t interface,
0833 struct phy_device *phydev,
0834 int speed, int duplex,
0835 bool tx_pause, bool rx_pause)
0836 {
0837 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0838 struct ethtool_eee *p = &priv->dev->ports[port].eee;
0839
0840 bcm_sf2_sw_mac_link_set(ds, port, interface, true);
0841
0842 if (port != core_readl(priv, CORE_IMP0_PRT_ID)) {
0843 u32 reg_rgmii_ctrl = 0;
0844 u32 reg, offset;
0845
0846 if (priv->type == BCM4908_DEVICE_ID ||
0847 priv->type == BCM7445_DEVICE_ID)
0848 offset = CORE_STS_OVERRIDE_GMIIP_PORT(port);
0849 else
0850 offset = CORE_STS_OVERRIDE_GMIIP2_PORT(port);
0851
0852 if (interface == PHY_INTERFACE_MODE_RGMII ||
0853 interface == PHY_INTERFACE_MODE_RGMII_TXID ||
0854 interface == PHY_INTERFACE_MODE_MII ||
0855 interface == PHY_INTERFACE_MODE_REVMII) {
0856 reg_rgmii_ctrl = bcm_sf2_reg_rgmii_cntrl(priv, port);
0857 reg = reg_readl(priv, reg_rgmii_ctrl);
0858 reg &= ~(RX_PAUSE_EN | TX_PAUSE_EN);
0859
0860 if (tx_pause)
0861 reg |= TX_PAUSE_EN;
0862 if (rx_pause)
0863 reg |= RX_PAUSE_EN;
0864
0865 reg_writel(priv, reg, reg_rgmii_ctrl);
0866 }
0867
0868 reg = SW_OVERRIDE | LINK_STS;
0869 switch (speed) {
0870 case SPEED_1000:
0871 reg |= SPDSTS_1000 << SPEED_SHIFT;
0872 break;
0873 case SPEED_100:
0874 reg |= SPDSTS_100 << SPEED_SHIFT;
0875 break;
0876 }
0877
0878 if (duplex == DUPLEX_FULL)
0879 reg |= DUPLX_MODE;
0880
0881 if (tx_pause)
0882 reg |= TXFLOW_CNTL;
0883 if (rx_pause)
0884 reg |= RXFLOW_CNTL;
0885
0886 core_writel(priv, reg, offset);
0887 }
0888
0889 if (mode == MLO_AN_PHY && phydev)
0890 p->eee_enabled = b53_eee_init(ds, port, phydev);
0891 }
0892
0893 static void bcm_sf2_sw_fixed_state(struct dsa_switch *ds, int port,
0894 struct phylink_link_state *status)
0895 {
0896 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0897
0898 status->link = false;
0899
0900
0901
0902
0903
0904
0905
0906
0907
0908 if (port == priv->moca_port) {
0909 status->link = priv->port_sts[port].link;
0910
0911
0912
0913
0914
0915 if (!status->link)
0916 netif_carrier_off(dsa_to_port(ds, port)->slave);
0917 status->duplex = DUPLEX_FULL;
0918 } else {
0919 status->link = true;
0920 }
0921 }
0922
0923 static void bcm_sf2_enable_acb(struct dsa_switch *ds)
0924 {
0925 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0926 u32 reg;
0927
0928
0929 reg = acb_readl(priv, ACB_CONTROL);
0930 reg |= (ACB_FLUSH_MASK << ACB_FLUSH_SHIFT);
0931 acb_writel(priv, reg, ACB_CONTROL);
0932 reg &= ~(ACB_FLUSH_MASK << ACB_FLUSH_SHIFT);
0933 reg |= ACB_EN | ACB_ALGORITHM;
0934 acb_writel(priv, reg, ACB_CONTROL);
0935 }
0936
0937 static int bcm_sf2_sw_suspend(struct dsa_switch *ds)
0938 {
0939 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0940 unsigned int port;
0941
0942 bcm_sf2_intr_disable(priv);
0943
0944
0945
0946
0947
0948 for (port = 0; port < ds->num_ports; port++) {
0949 if (dsa_is_user_port(ds, port) || dsa_is_cpu_port(ds, port))
0950 bcm_sf2_port_disable(ds, port);
0951 }
0952
0953 if (!priv->wol_ports_mask)
0954 clk_disable_unprepare(priv->clk);
0955
0956 return 0;
0957 }
0958
0959 static int bcm_sf2_sw_resume(struct dsa_switch *ds)
0960 {
0961 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0962 int ret;
0963
0964 if (!priv->wol_ports_mask)
0965 clk_prepare_enable(priv->clk);
0966
0967 ret = bcm_sf2_sw_rst(priv);
0968 if (ret) {
0969 pr_err("%s: failed to software reset switch\n", __func__);
0970 return ret;
0971 }
0972
0973 bcm_sf2_crossbar_setup(priv);
0974
0975 ret = bcm_sf2_cfp_resume(ds);
0976 if (ret)
0977 return ret;
0978
0979 if (priv->hw_params.num_gphy == 1)
0980 bcm_sf2_gphy_enable_set(ds, true);
0981
0982 ds->ops->setup(ds);
0983
0984 return 0;
0985 }
0986
0987 static void bcm_sf2_sw_get_wol(struct dsa_switch *ds, int port,
0988 struct ethtool_wolinfo *wol)
0989 {
0990 struct net_device *p = dsa_to_port(ds, port)->cpu_dp->master;
0991 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
0992 struct ethtool_wolinfo pwol = { };
0993
0994
0995 if (p->ethtool_ops->get_wol)
0996 p->ethtool_ops->get_wol(p, &pwol);
0997
0998
0999 wol->supported = pwol.supported;
1000 memset(&wol->sopass, 0, sizeof(wol->sopass));
1001
1002 if (pwol.wolopts & WAKE_MAGICSECURE)
1003 memcpy(&wol->sopass, pwol.sopass, sizeof(wol->sopass));
1004
1005 if (priv->wol_ports_mask & (1 << port))
1006 wol->wolopts = pwol.wolopts;
1007 else
1008 wol->wolopts = 0;
1009 }
1010
1011 static int bcm_sf2_sw_set_wol(struct dsa_switch *ds, int port,
1012 struct ethtool_wolinfo *wol)
1013 {
1014 struct net_device *p = dsa_to_port(ds, port)->cpu_dp->master;
1015 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
1016 s8 cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
1017 struct ethtool_wolinfo pwol = { };
1018
1019 if (p->ethtool_ops->get_wol)
1020 p->ethtool_ops->get_wol(p, &pwol);
1021 if (wol->wolopts & ~pwol.supported)
1022 return -EINVAL;
1023
1024 if (wol->wolopts)
1025 priv->wol_ports_mask |= (1 << port);
1026 else
1027 priv->wol_ports_mask &= ~(1 << port);
1028
1029
1030
1031
1032
1033 if (priv->wol_ports_mask && priv->wol_ports_mask != (1 << cpu_port))
1034 priv->wol_ports_mask |= (1 << cpu_port);
1035 else
1036 priv->wol_ports_mask &= ~(1 << cpu_port);
1037
1038 return p->ethtool_ops->set_wol(p, wol);
1039 }
1040
1041 static int bcm_sf2_sw_setup(struct dsa_switch *ds)
1042 {
1043 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
1044 unsigned int port;
1045
1046
1047 for (port = 0; port < priv->hw_params.num_ports; port++) {
1048
1049 if (dsa_is_user_port(ds, port))
1050 bcm_sf2_port_setup(ds, port, NULL);
1051 else if (dsa_is_cpu_port(ds, port))
1052 bcm_sf2_imp_setup(ds, port);
1053 else
1054 bcm_sf2_port_disable(ds, port);
1055 }
1056
1057 b53_configure_vlan(ds);
1058 bcm_sf2_enable_acb(ds);
1059
1060 return b53_setup_devlink_resources(ds);
1061 }
1062
1063 static void bcm_sf2_sw_teardown(struct dsa_switch *ds)
1064 {
1065 dsa_devlink_resources_unregister(ds);
1066 }
1067
1068
1069
1070
1071
1072 #define SF2_PAGE_REG_MKADDR(page, reg) ((page) << 10 | (reg) << 2)
1073
1074 static int bcm_sf2_core_read8(struct b53_device *dev, u8 page, u8 reg,
1075 u8 *val)
1076 {
1077 struct bcm_sf2_priv *priv = dev->priv;
1078
1079 *val = core_readl(priv, SF2_PAGE_REG_MKADDR(page, reg));
1080
1081 return 0;
1082 }
1083
1084 static int bcm_sf2_core_read16(struct b53_device *dev, u8 page, u8 reg,
1085 u16 *val)
1086 {
1087 struct bcm_sf2_priv *priv = dev->priv;
1088
1089 *val = core_readl(priv, SF2_PAGE_REG_MKADDR(page, reg));
1090
1091 return 0;
1092 }
1093
1094 static int bcm_sf2_core_read32(struct b53_device *dev, u8 page, u8 reg,
1095 u32 *val)
1096 {
1097 struct bcm_sf2_priv *priv = dev->priv;
1098
1099 *val = core_readl(priv, SF2_PAGE_REG_MKADDR(page, reg));
1100
1101 return 0;
1102 }
1103
1104 static int bcm_sf2_core_read64(struct b53_device *dev, u8 page, u8 reg,
1105 u64 *val)
1106 {
1107 struct bcm_sf2_priv *priv = dev->priv;
1108
1109 *val = core_readq(priv, SF2_PAGE_REG_MKADDR(page, reg));
1110
1111 return 0;
1112 }
1113
1114 static int bcm_sf2_core_write8(struct b53_device *dev, u8 page, u8 reg,
1115 u8 value)
1116 {
1117 struct bcm_sf2_priv *priv = dev->priv;
1118
1119 core_writel(priv, value, SF2_PAGE_REG_MKADDR(page, reg));
1120
1121 return 0;
1122 }
1123
1124 static int bcm_sf2_core_write16(struct b53_device *dev, u8 page, u8 reg,
1125 u16 value)
1126 {
1127 struct bcm_sf2_priv *priv = dev->priv;
1128
1129 core_writel(priv, value, SF2_PAGE_REG_MKADDR(page, reg));
1130
1131 return 0;
1132 }
1133
1134 static int bcm_sf2_core_write32(struct b53_device *dev, u8 page, u8 reg,
1135 u32 value)
1136 {
1137 struct bcm_sf2_priv *priv = dev->priv;
1138
1139 core_writel(priv, value, SF2_PAGE_REG_MKADDR(page, reg));
1140
1141 return 0;
1142 }
1143
1144 static int bcm_sf2_core_write64(struct b53_device *dev, u8 page, u8 reg,
1145 u64 value)
1146 {
1147 struct bcm_sf2_priv *priv = dev->priv;
1148
1149 core_writeq(priv, value, SF2_PAGE_REG_MKADDR(page, reg));
1150
1151 return 0;
1152 }
1153
1154 static const struct b53_io_ops bcm_sf2_io_ops = {
1155 .read8 = bcm_sf2_core_read8,
1156 .read16 = bcm_sf2_core_read16,
1157 .read32 = bcm_sf2_core_read32,
1158 .read48 = bcm_sf2_core_read64,
1159 .read64 = bcm_sf2_core_read64,
1160 .write8 = bcm_sf2_core_write8,
1161 .write16 = bcm_sf2_core_write16,
1162 .write32 = bcm_sf2_core_write32,
1163 .write48 = bcm_sf2_core_write64,
1164 .write64 = bcm_sf2_core_write64,
1165 };
1166
1167 static void bcm_sf2_sw_get_strings(struct dsa_switch *ds, int port,
1168 u32 stringset, uint8_t *data)
1169 {
1170 int cnt = b53_get_sset_count(ds, port, stringset);
1171
1172 b53_get_strings(ds, port, stringset, data);
1173 bcm_sf2_cfp_get_strings(ds, port, stringset,
1174 data + cnt * ETH_GSTRING_LEN);
1175 }
1176
1177 static void bcm_sf2_sw_get_ethtool_stats(struct dsa_switch *ds, int port,
1178 uint64_t *data)
1179 {
1180 int cnt = b53_get_sset_count(ds, port, ETH_SS_STATS);
1181
1182 b53_get_ethtool_stats(ds, port, data);
1183 bcm_sf2_cfp_get_ethtool_stats(ds, port, data + cnt);
1184 }
1185
1186 static int bcm_sf2_sw_get_sset_count(struct dsa_switch *ds, int port,
1187 int sset)
1188 {
1189 int cnt = b53_get_sset_count(ds, port, sset);
1190
1191 if (cnt < 0)
1192 return cnt;
1193
1194 cnt += bcm_sf2_cfp_get_sset_count(ds, port, sset);
1195
1196 return cnt;
1197 }
1198
1199 static const struct dsa_switch_ops bcm_sf2_ops = {
1200 .get_tag_protocol = b53_get_tag_protocol,
1201 .setup = bcm_sf2_sw_setup,
1202 .teardown = bcm_sf2_sw_teardown,
1203 .get_strings = bcm_sf2_sw_get_strings,
1204 .get_ethtool_stats = bcm_sf2_sw_get_ethtool_stats,
1205 .get_sset_count = bcm_sf2_sw_get_sset_count,
1206 .get_ethtool_phy_stats = b53_get_ethtool_phy_stats,
1207 .get_phy_flags = bcm_sf2_sw_get_phy_flags,
1208 .phylink_get_caps = bcm_sf2_sw_get_caps,
1209 .phylink_mac_config = bcm_sf2_sw_mac_config,
1210 .phylink_mac_link_down = bcm_sf2_sw_mac_link_down,
1211 .phylink_mac_link_up = bcm_sf2_sw_mac_link_up,
1212 .phylink_fixed_state = bcm_sf2_sw_fixed_state,
1213 .suspend = bcm_sf2_sw_suspend,
1214 .resume = bcm_sf2_sw_resume,
1215 .get_wol = bcm_sf2_sw_get_wol,
1216 .set_wol = bcm_sf2_sw_set_wol,
1217 .port_enable = bcm_sf2_port_setup,
1218 .port_disable = bcm_sf2_port_disable,
1219 .get_mac_eee = b53_get_mac_eee,
1220 .set_mac_eee = b53_set_mac_eee,
1221 .port_bridge_join = b53_br_join,
1222 .port_bridge_leave = b53_br_leave,
1223 .port_pre_bridge_flags = b53_br_flags_pre,
1224 .port_bridge_flags = b53_br_flags,
1225 .port_stp_state_set = b53_br_set_stp_state,
1226 .port_fast_age = b53_br_fast_age,
1227 .port_vlan_filtering = b53_vlan_filtering,
1228 .port_vlan_add = b53_vlan_add,
1229 .port_vlan_del = b53_vlan_del,
1230 .port_fdb_dump = b53_fdb_dump,
1231 .port_fdb_add = b53_fdb_add,
1232 .port_fdb_del = b53_fdb_del,
1233 .get_rxnfc = bcm_sf2_get_rxnfc,
1234 .set_rxnfc = bcm_sf2_set_rxnfc,
1235 .port_mirror_add = b53_mirror_add,
1236 .port_mirror_del = b53_mirror_del,
1237 .port_mdb_add = b53_mdb_add,
1238 .port_mdb_del = b53_mdb_del,
1239 };
1240
1241 struct bcm_sf2_of_data {
1242 u32 type;
1243 const u16 *reg_offsets;
1244 unsigned int core_reg_align;
1245 unsigned int num_cfp_rules;
1246 unsigned int num_crossbar_int_ports;
1247 };
1248
1249 static const u16 bcm_sf2_4908_reg_offsets[] = {
1250 [REG_SWITCH_CNTRL] = 0x00,
1251 [REG_SWITCH_STATUS] = 0x04,
1252 [REG_DIR_DATA_WRITE] = 0x08,
1253 [REG_DIR_DATA_READ] = 0x0c,
1254 [REG_SWITCH_REVISION] = 0x10,
1255 [REG_PHY_REVISION] = 0x14,
1256 [REG_SPHY_CNTRL] = 0x24,
1257 [REG_CROSSBAR] = 0xc8,
1258 [REG_RGMII_11_CNTRL] = 0x014c,
1259 [REG_LED_0_CNTRL] = 0x40,
1260 [REG_LED_1_CNTRL] = 0x4c,
1261 [REG_LED_2_CNTRL] = 0x58,
1262 [REG_LED_3_CNTRL] = 0x64,
1263 [REG_LED_4_CNTRL] = 0x88,
1264 [REG_LED_5_CNTRL] = 0xa0,
1265 [REG_LED_AGGREGATE_CTRL] = 0xb8,
1266
1267 };
1268
1269 static const struct bcm_sf2_of_data bcm_sf2_4908_data = {
1270 .type = BCM4908_DEVICE_ID,
1271 .core_reg_align = 0,
1272 .reg_offsets = bcm_sf2_4908_reg_offsets,
1273 .num_cfp_rules = 256,
1274 .num_crossbar_int_ports = 2,
1275 };
1276
1277
1278 static const u16 bcm_sf2_7445_reg_offsets[] = {
1279 [REG_SWITCH_CNTRL] = 0x00,
1280 [REG_SWITCH_STATUS] = 0x04,
1281 [REG_DIR_DATA_WRITE] = 0x08,
1282 [REG_DIR_DATA_READ] = 0x0C,
1283 [REG_SWITCH_REVISION] = 0x18,
1284 [REG_PHY_REVISION] = 0x1C,
1285 [REG_SPHY_CNTRL] = 0x2C,
1286 [REG_RGMII_0_CNTRL] = 0x34,
1287 [REG_RGMII_1_CNTRL] = 0x40,
1288 [REG_RGMII_2_CNTRL] = 0x4c,
1289 [REG_LED_0_CNTRL] = 0x90,
1290 [REG_LED_1_CNTRL] = 0x94,
1291 [REG_LED_2_CNTRL] = 0x98,
1292 };
1293
1294 static const struct bcm_sf2_of_data bcm_sf2_7445_data = {
1295 .type = BCM7445_DEVICE_ID,
1296 .core_reg_align = 0,
1297 .reg_offsets = bcm_sf2_7445_reg_offsets,
1298 .num_cfp_rules = 256,
1299 };
1300
1301 static const u16 bcm_sf2_7278_reg_offsets[] = {
1302 [REG_SWITCH_CNTRL] = 0x00,
1303 [REG_SWITCH_STATUS] = 0x04,
1304 [REG_DIR_DATA_WRITE] = 0x08,
1305 [REG_DIR_DATA_READ] = 0x0c,
1306 [REG_SWITCH_REVISION] = 0x10,
1307 [REG_PHY_REVISION] = 0x14,
1308 [REG_SPHY_CNTRL] = 0x24,
1309 [REG_RGMII_0_CNTRL] = 0xe0,
1310 [REG_RGMII_1_CNTRL] = 0xec,
1311 [REG_RGMII_2_CNTRL] = 0xf8,
1312 [REG_LED_0_CNTRL] = 0x40,
1313 [REG_LED_1_CNTRL] = 0x4c,
1314 [REG_LED_2_CNTRL] = 0x58,
1315 };
1316
1317 static const struct bcm_sf2_of_data bcm_sf2_7278_data = {
1318 .type = BCM7278_DEVICE_ID,
1319 .core_reg_align = 1,
1320 .reg_offsets = bcm_sf2_7278_reg_offsets,
1321 .num_cfp_rules = 128,
1322 };
1323
1324 static const struct of_device_id bcm_sf2_of_match[] = {
1325 { .compatible = "brcm,bcm4908-switch",
1326 .data = &bcm_sf2_4908_data
1327 },
1328 { .compatible = "brcm,bcm7445-switch-v4.0",
1329 .data = &bcm_sf2_7445_data
1330 },
1331 { .compatible = "brcm,bcm7278-switch-v4.0",
1332 .data = &bcm_sf2_7278_data
1333 },
1334 { .compatible = "brcm,bcm7278-switch-v4.8",
1335 .data = &bcm_sf2_7278_data
1336 },
1337 { },
1338 };
1339 MODULE_DEVICE_TABLE(of, bcm_sf2_of_match);
1340
1341 static int bcm_sf2_sw_probe(struct platform_device *pdev)
1342 {
1343 const char *reg_names[BCM_SF2_REGS_NUM] = BCM_SF2_REGS_NAME;
1344 struct device_node *dn = pdev->dev.of_node;
1345 const struct of_device_id *of_id = NULL;
1346 const struct bcm_sf2_of_data *data;
1347 struct b53_platform_data *pdata;
1348 struct dsa_switch_ops *ops;
1349 struct device_node *ports;
1350 struct bcm_sf2_priv *priv;
1351 struct b53_device *dev;
1352 struct dsa_switch *ds;
1353 void __iomem **base;
1354 unsigned int i;
1355 u32 reg, rev;
1356 int ret;
1357
1358 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
1359 if (!priv)
1360 return -ENOMEM;
1361
1362 ops = devm_kzalloc(&pdev->dev, sizeof(*ops), GFP_KERNEL);
1363 if (!ops)
1364 return -ENOMEM;
1365
1366 dev = b53_switch_alloc(&pdev->dev, &bcm_sf2_io_ops, priv);
1367 if (!dev)
1368 return -ENOMEM;
1369
1370 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
1371 if (!pdata)
1372 return -ENOMEM;
1373
1374 of_id = of_match_node(bcm_sf2_of_match, dn);
1375 if (!of_id || !of_id->data)
1376 return -EINVAL;
1377
1378 data = of_id->data;
1379
1380
1381 priv->type = data->type;
1382 priv->reg_offsets = data->reg_offsets;
1383 priv->core_reg_align = data->core_reg_align;
1384 priv->num_cfp_rules = data->num_cfp_rules;
1385 priv->num_crossbar_int_ports = data->num_crossbar_int_ports;
1386
1387 priv->rcdev = devm_reset_control_get_optional_exclusive(&pdev->dev,
1388 "switch");
1389 if (IS_ERR(priv->rcdev))
1390 return PTR_ERR(priv->rcdev);
1391
1392
1393
1394
1395
1396 pdata->chip_id = priv->type;
1397 dev->pdata = pdata;
1398
1399 priv->dev = dev;
1400 ds = dev->ds;
1401 ds->ops = &bcm_sf2_ops;
1402
1403
1404 ds->num_tx_queues = SF2_NUM_EGRESS_QUEUES;
1405
1406 dev_set_drvdata(&pdev->dev, priv);
1407
1408 spin_lock_init(&priv->indir_lock);
1409 mutex_init(&priv->cfp.lock);
1410 INIT_LIST_HEAD(&priv->cfp.rules_list);
1411
1412
1413
1414
1415 set_bit(0, priv->cfp.used);
1416 set_bit(0, priv->cfp.unique);
1417
1418
1419 of_node_get(dn);
1420 ports = of_find_node_by_name(dn, "ports");
1421 if (ports) {
1422 bcm_sf2_identify_ports(priv, ports);
1423 of_node_put(ports);
1424 }
1425
1426 priv->irq0 = irq_of_parse_and_map(dn, 0);
1427 priv->irq1 = irq_of_parse_and_map(dn, 1);
1428
1429 base = &priv->core;
1430 for (i = 0; i < BCM_SF2_REGS_NUM; i++) {
1431 *base = devm_platform_ioremap_resource(pdev, i);
1432 if (IS_ERR(*base)) {
1433 pr_err("unable to find register: %s\n", reg_names[i]);
1434 return PTR_ERR(*base);
1435 }
1436 base++;
1437 }
1438
1439 priv->clk = devm_clk_get_optional(&pdev->dev, "sw_switch");
1440 if (IS_ERR(priv->clk))
1441 return PTR_ERR(priv->clk);
1442
1443 clk_prepare_enable(priv->clk);
1444
1445 priv->clk_mdiv = devm_clk_get_optional(&pdev->dev, "sw_switch_mdiv");
1446 if (IS_ERR(priv->clk_mdiv)) {
1447 ret = PTR_ERR(priv->clk_mdiv);
1448 goto out_clk;
1449 }
1450
1451 clk_prepare_enable(priv->clk_mdiv);
1452
1453 ret = bcm_sf2_sw_rst(priv);
1454 if (ret) {
1455 pr_err("unable to software reset switch: %d\n", ret);
1456 goto out_clk_mdiv;
1457 }
1458
1459 bcm_sf2_crossbar_setup(priv);
1460
1461 bcm_sf2_gphy_enable_set(priv->dev->ds, true);
1462
1463 ret = bcm_sf2_mdio_register(ds);
1464 if (ret) {
1465 pr_err("failed to register MDIO bus\n");
1466 goto out_clk_mdiv;
1467 }
1468
1469 bcm_sf2_gphy_enable_set(priv->dev->ds, false);
1470
1471 ret = bcm_sf2_cfp_rst(priv);
1472 if (ret) {
1473 pr_err("failed to reset CFP\n");
1474 goto out_mdio;
1475 }
1476
1477
1478 bcm_sf2_intr_disable(priv);
1479
1480 ret = devm_request_irq(&pdev->dev, priv->irq0, bcm_sf2_switch_0_isr, 0,
1481 "switch_0", ds);
1482 if (ret < 0) {
1483 pr_err("failed to request switch_0 IRQ\n");
1484 goto out_mdio;
1485 }
1486
1487 ret = devm_request_irq(&pdev->dev, priv->irq1, bcm_sf2_switch_1_isr, 0,
1488 "switch_1", ds);
1489 if (ret < 0) {
1490 pr_err("failed to request switch_1 IRQ\n");
1491 goto out_mdio;
1492 }
1493
1494
1495 reg = core_readl(priv, CORE_GMNCFGCFG);
1496 reg |= RST_MIB_CNT;
1497 core_writel(priv, reg, CORE_GMNCFGCFG);
1498 reg &= ~RST_MIB_CNT;
1499 core_writel(priv, reg, CORE_GMNCFGCFG);
1500
1501
1502 priv->hw_params.num_ports = core_readl(priv, CORE_IMP0_PRT_ID) + 1;
1503 if (priv->hw_params.num_ports > DSA_MAX_PORTS)
1504 priv->hw_params.num_ports = DSA_MAX_PORTS;
1505
1506
1507 if (of_property_read_u32(dn, "brcm,num-gphy",
1508 &priv->hw_params.num_gphy))
1509 priv->hw_params.num_gphy = 1;
1510
1511 rev = reg_readl(priv, REG_SWITCH_REVISION);
1512 priv->hw_params.top_rev = (rev >> SWITCH_TOP_REV_SHIFT) &
1513 SWITCH_TOP_REV_MASK;
1514 priv->hw_params.core_rev = (rev & SF2_REV_MASK);
1515
1516 rev = reg_readl(priv, REG_PHY_REVISION);
1517 priv->hw_params.gphy_rev = rev & PHY_REVISION_MASK;
1518
1519 ret = b53_switch_register(dev);
1520 if (ret)
1521 goto out_mdio;
1522
1523 dev_info(&pdev->dev,
1524 "Starfighter 2 top: %x.%02x, core: %x.%02x, IRQs: %d, %d\n",
1525 priv->hw_params.top_rev >> 8, priv->hw_params.top_rev & 0xff,
1526 priv->hw_params.core_rev >> 8, priv->hw_params.core_rev & 0xff,
1527 priv->irq0, priv->irq1);
1528
1529 return 0;
1530
1531 out_mdio:
1532 bcm_sf2_mdio_unregister(priv);
1533 out_clk_mdiv:
1534 clk_disable_unprepare(priv->clk_mdiv);
1535 out_clk:
1536 clk_disable_unprepare(priv->clk);
1537 return ret;
1538 }
1539
1540 static int bcm_sf2_sw_remove(struct platform_device *pdev)
1541 {
1542 struct bcm_sf2_priv *priv = platform_get_drvdata(pdev);
1543
1544 if (!priv)
1545 return 0;
1546
1547 priv->wol_ports_mask = 0;
1548
1549 bcm_sf2_intr_disable(priv);
1550 dsa_unregister_switch(priv->dev->ds);
1551 bcm_sf2_cfp_exit(priv->dev->ds);
1552 bcm_sf2_mdio_unregister(priv);
1553 clk_disable_unprepare(priv->clk_mdiv);
1554 clk_disable_unprepare(priv->clk);
1555 if (priv->type == BCM7278_DEVICE_ID)
1556 reset_control_assert(priv->rcdev);
1557
1558 platform_set_drvdata(pdev, NULL);
1559
1560 return 0;
1561 }
1562
1563 static void bcm_sf2_sw_shutdown(struct platform_device *pdev)
1564 {
1565 struct bcm_sf2_priv *priv = platform_get_drvdata(pdev);
1566
1567 if (!priv)
1568 return;
1569
1570
1571
1572
1573
1574
1575
1576 if (priv->hw_params.num_gphy == 1)
1577 bcm_sf2_gphy_enable_set(priv->dev->ds, true);
1578
1579 dsa_switch_shutdown(priv->dev->ds);
1580
1581 platform_set_drvdata(pdev, NULL);
1582 }
1583
1584 #ifdef CONFIG_PM_SLEEP
1585 static int bcm_sf2_suspend(struct device *dev)
1586 {
1587 struct bcm_sf2_priv *priv = dev_get_drvdata(dev);
1588
1589 return dsa_switch_suspend(priv->dev->ds);
1590 }
1591
1592 static int bcm_sf2_resume(struct device *dev)
1593 {
1594 struct bcm_sf2_priv *priv = dev_get_drvdata(dev);
1595
1596 return dsa_switch_resume(priv->dev->ds);
1597 }
1598 #endif
1599
1600 static SIMPLE_DEV_PM_OPS(bcm_sf2_pm_ops,
1601 bcm_sf2_suspend, bcm_sf2_resume);
1602
1603
1604 static struct platform_driver bcm_sf2_driver = {
1605 .probe = bcm_sf2_sw_probe,
1606 .remove = bcm_sf2_sw_remove,
1607 .shutdown = bcm_sf2_sw_shutdown,
1608 .driver = {
1609 .name = "brcm-sf2",
1610 .of_match_table = bcm_sf2_of_match,
1611 .pm = &bcm_sf2_pm_ops,
1612 },
1613 };
1614 module_platform_driver(bcm_sf2_driver);
1615
1616 MODULE_AUTHOR("Broadcom Corporation");
1617 MODULE_DESCRIPTION("Driver for Broadcom Starfighter 2 ethernet switch chip");
1618 MODULE_LICENSE("GPL");
1619 MODULE_ALIAS("platform:brcm-sf2");