1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Marvell 88E6xxx Switch Global 2 Registers support
5 * Copyright (c) 2008 Marvell Semiconductor
7 * Copyright (c) 2016-2017 Savoir-faire Linux Inc.
8 * Vivien Didelot <vivien.didelot@savoirfairelinux.com>
11 #include <linux/bitfield.h>
12 #include <linux/interrupt.h>
13 #include <linux/irqdomain.h>
16 #include "global1.h" /* for MV88E6XXX_G1_STS_IRQ_DEVICE */
19 int mv88e6xxx_g2_read(struct mv88e6xxx_chip *chip, int reg, u16 *val)
21 return mv88e6xxx_read(chip, chip->info->global2_addr, reg, val);
24 int mv88e6xxx_g2_write(struct mv88e6xxx_chip *chip, int reg, u16 val)
26 return mv88e6xxx_write(chip, chip->info->global2_addr, reg, val);
29 int mv88e6xxx_g2_wait_bit(struct mv88e6xxx_chip *chip, int reg, int
32 return mv88e6xxx_wait_bit(chip, chip->info->global2_addr, reg,
36 /* Offset 0x00: Interrupt Source Register */
38 static int mv88e6xxx_g2_int_source(struct mv88e6xxx_chip *chip, u16 *src)
40 /* Read (and clear most of) the Interrupt Source bits */
41 return mv88e6xxx_g2_read(chip, MV88E6XXX_G2_INT_SRC, src);
44 /* Offset 0x01: Interrupt Mask Register */
46 static int mv88e6xxx_g2_int_mask(struct mv88e6xxx_chip *chip, u16 mask)
48 return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_INT_MASK, mask);
51 /* Offset 0x02: Management Enable 2x */
53 static int mv88e6xxx_g2_mgmt_enable_2x(struct mv88e6xxx_chip *chip, u16 en2x)
55 return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_MGMT_EN_2X, en2x);
58 /* Offset 0x03: Management Enable 0x */
60 static int mv88e6xxx_g2_mgmt_enable_0x(struct mv88e6xxx_chip *chip, u16 en0x)
62 return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_MGMT_EN_0X, en0x);
65 /* Offset 0x05: Switch Management Register */
67 static int mv88e6xxx_g2_switch_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip,
73 err = mv88e6xxx_g2_read(chip, MV88E6XXX_G2_SWITCH_MGMT, &val);
78 val |= MV88E6XXX_G2_SWITCH_MGMT_RSVD2CPU;
80 val &= ~MV88E6XXX_G2_SWITCH_MGMT_RSVD2CPU;
82 return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SWITCH_MGMT, val);
85 int mv88e6185_g2_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip)
89 /* Consider the frames with reserved multicast destination
90 * addresses matching 01:80:c2:00:00:0x as MGMT.
92 err = mv88e6xxx_g2_mgmt_enable_0x(chip, 0xffff);
96 return mv88e6xxx_g2_switch_mgmt_rsvd2cpu(chip, true);
99 int mv88e6352_g2_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip)
103 /* Consider the frames with reserved multicast destination
104 * addresses matching 01:80:c2:00:00:2x as MGMT.
106 err = mv88e6xxx_g2_mgmt_enable_2x(chip, 0xffff);
110 return mv88e6185_g2_mgmt_rsvd2cpu(chip);
113 /* Offset 0x06: Device Mapping Table register */
115 int mv88e6xxx_g2_device_mapping_write(struct mv88e6xxx_chip *chip, int target,
118 u16 val = (target << 8) | (port & 0x1f);
119 /* Modern chips use 5 bits to define a device mapping port,
120 * but bit 4 is reserved on older chips, so it is safe to use.
123 return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_DEVICE_MAPPING,
124 MV88E6XXX_G2_DEVICE_MAPPING_UPDATE | val);
127 /* Offset 0x07: Trunk Mask Table register */
129 static int mv88e6xxx_g2_trunk_mask_write(struct mv88e6xxx_chip *chip, int num,
132 u16 val = (num << 12) | (mask & mv88e6xxx_port_mask(chip));
135 val |= MV88E6XXX_G2_TRUNK_MASK_HASH;
137 return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_TRUNK_MASK,
138 MV88E6XXX_G2_TRUNK_MASK_UPDATE | val);
141 /* Offset 0x08: Trunk Mapping Table register */
143 static int mv88e6xxx_g2_trunk_mapping_write(struct mv88e6xxx_chip *chip, int id,
146 const u16 port_mask = BIT(mv88e6xxx_num_ports(chip)) - 1;
147 u16 val = (id << 11) | (map & port_mask);
149 return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_TRUNK_MAPPING,
150 MV88E6XXX_G2_TRUNK_MAPPING_UPDATE | val);
153 int mv88e6xxx_g2_trunk_clear(struct mv88e6xxx_chip *chip)
155 const u16 port_mask = BIT(mv88e6xxx_num_ports(chip)) - 1;
158 /* Clear all eight possible Trunk Mask vectors */
159 for (i = 0; i < 8; ++i) {
160 err = mv88e6xxx_g2_trunk_mask_write(chip, i, false, port_mask);
165 /* Clear all sixteen possible Trunk ID routing vectors */
166 for (i = 0; i < 16; ++i) {
167 err = mv88e6xxx_g2_trunk_mapping_write(chip, i, 0);
175 /* Offset 0x09: Ingress Rate Command register
176 * Offset 0x0A: Ingress Rate Data register
179 static int mv88e6xxx_g2_irl_wait(struct mv88e6xxx_chip *chip)
181 int bit = __bf_shf(MV88E6XXX_G2_IRL_CMD_BUSY);
183 return mv88e6xxx_g2_wait_bit(chip, MV88E6XXX_G2_IRL_CMD, bit, 0);
186 static int mv88e6xxx_g2_irl_op(struct mv88e6xxx_chip *chip, u16 op, int port,
191 err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_IRL_CMD,
192 MV88E6XXX_G2_IRL_CMD_BUSY | op | (port << 8) |
197 return mv88e6xxx_g2_irl_wait(chip);
200 int mv88e6352_g2_irl_init_all(struct mv88e6xxx_chip *chip, int port)
202 return mv88e6xxx_g2_irl_op(chip, MV88E6352_G2_IRL_CMD_OP_INIT_ALL, port,
206 int mv88e6390_g2_irl_init_all(struct mv88e6xxx_chip *chip, int port)
208 return mv88e6xxx_g2_irl_op(chip, MV88E6390_G2_IRL_CMD_OP_INIT_ALL, port,
212 /* Offset 0x0B: Cross-chip Port VLAN (Addr) Register
213 * Offset 0x0C: Cross-chip Port VLAN Data Register
216 static int mv88e6xxx_g2_pvt_op_wait(struct mv88e6xxx_chip *chip)
218 int bit = __bf_shf(MV88E6XXX_G2_PVT_ADDR_BUSY);
220 return mv88e6xxx_g2_wait_bit(chip, MV88E6XXX_G2_PVT_ADDR, bit, 0);
223 static int mv88e6xxx_g2_pvt_op(struct mv88e6xxx_chip *chip, int src_dev,
224 int src_port, u16 op)
228 /* 9-bit Cross-chip PVT pointer: with MV88E6XXX_G2_MISC_5_BIT_PORT
229 * cleared, source device is 5-bit, source port is 4-bit.
231 op |= MV88E6XXX_G2_PVT_ADDR_BUSY;
232 op |= (src_dev & 0x1f) << 4;
233 op |= (src_port & 0xf);
235 err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_PVT_ADDR, op);
239 return mv88e6xxx_g2_pvt_op_wait(chip);
242 int mv88e6xxx_g2_pvt_write(struct mv88e6xxx_chip *chip, int src_dev,
243 int src_port, u16 data)
247 err = mv88e6xxx_g2_pvt_op_wait(chip);
251 err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_PVT_DATA, data);
255 return mv88e6xxx_g2_pvt_op(chip, src_dev, src_port,
256 MV88E6XXX_G2_PVT_ADDR_OP_WRITE_PVLAN);
259 /* Offset 0x0D: Switch MAC/WoL/WoF register */
261 static int mv88e6xxx_g2_switch_mac_write(struct mv88e6xxx_chip *chip,
262 unsigned int pointer, u8 data)
264 u16 val = (pointer << 8) | data;
266 return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SWITCH_MAC,
267 MV88E6XXX_G2_SWITCH_MAC_UPDATE | val);
270 int mv88e6xxx_g2_set_switch_mac(struct mv88e6xxx_chip *chip, u8 *addr)
274 for (i = 0; i < 6; i++) {
275 err = mv88e6xxx_g2_switch_mac_write(chip, i, addr[i]);
283 /* Offset 0x0E: ATU Statistics */
285 int mv88e6xxx_g2_atu_stats_set(struct mv88e6xxx_chip *chip, u16 kind, u16 bin)
287 return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_ATU_STATS,
291 int mv88e6xxx_g2_atu_stats_get(struct mv88e6xxx_chip *chip, u16 *stats)
293 return mv88e6xxx_g2_read(chip, MV88E6XXX_G2_ATU_STATS, stats);
296 /* Offset 0x0F: Priority Override Table */
298 static int mv88e6xxx_g2_pot_write(struct mv88e6xxx_chip *chip, int pointer,
301 u16 val = (pointer << 8) | (data & 0x7);
303 return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_PRIO_OVERRIDE,
304 MV88E6XXX_G2_PRIO_OVERRIDE_UPDATE | val);
307 int mv88e6xxx_g2_pot_clear(struct mv88e6xxx_chip *chip)
311 /* Clear all sixteen possible Priority Override entries */
312 for (i = 0; i < 16; i++) {
313 err = mv88e6xxx_g2_pot_write(chip, i, 0);
321 /* Offset 0x14: EEPROM Command
322 * Offset 0x15: EEPROM Data (for 16-bit data access)
323 * Offset 0x15: EEPROM Addr (for 8-bit data access)
326 static int mv88e6xxx_g2_eeprom_wait(struct mv88e6xxx_chip *chip)
328 int bit = __bf_shf(MV88E6XXX_G2_EEPROM_CMD_BUSY);
331 err = mv88e6xxx_g2_wait_bit(chip, MV88E6XXX_G2_EEPROM_CMD, bit, 0);
335 bit = __bf_shf(MV88E6XXX_G2_EEPROM_CMD_RUNNING);
337 return mv88e6xxx_g2_wait_bit(chip, MV88E6XXX_G2_EEPROM_CMD, bit, 0);
340 static int mv88e6xxx_g2_eeprom_cmd(struct mv88e6xxx_chip *chip, u16 cmd)
344 err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_EEPROM_CMD,
345 MV88E6XXX_G2_EEPROM_CMD_BUSY | cmd);
349 return mv88e6xxx_g2_eeprom_wait(chip);
352 static int mv88e6xxx_g2_eeprom_read8(struct mv88e6xxx_chip *chip,
355 u16 cmd = MV88E6XXX_G2_EEPROM_CMD_OP_READ;
358 err = mv88e6xxx_g2_eeprom_wait(chip);
362 err = mv88e6xxx_g2_write(chip, MV88E6390_G2_EEPROM_ADDR, addr);
366 err = mv88e6xxx_g2_eeprom_cmd(chip, cmd);
370 err = mv88e6xxx_g2_read(chip, MV88E6XXX_G2_EEPROM_CMD, &cmd);
379 static int mv88e6xxx_g2_eeprom_write8(struct mv88e6xxx_chip *chip,
382 u16 cmd = MV88E6XXX_G2_EEPROM_CMD_OP_WRITE |
383 MV88E6XXX_G2_EEPROM_CMD_WRITE_EN;
386 err = mv88e6xxx_g2_eeprom_wait(chip);
390 err = mv88e6xxx_g2_write(chip, MV88E6390_G2_EEPROM_ADDR, addr);
394 return mv88e6xxx_g2_eeprom_cmd(chip, cmd | data);
397 static int mv88e6xxx_g2_eeprom_read16(struct mv88e6xxx_chip *chip,
400 u16 cmd = MV88E6XXX_G2_EEPROM_CMD_OP_READ | addr;
403 err = mv88e6xxx_g2_eeprom_wait(chip);
407 err = mv88e6xxx_g2_eeprom_cmd(chip, cmd);
411 return mv88e6xxx_g2_read(chip, MV88E6352_G2_EEPROM_DATA, data);
414 static int mv88e6xxx_g2_eeprom_write16(struct mv88e6xxx_chip *chip,
417 u16 cmd = MV88E6XXX_G2_EEPROM_CMD_OP_WRITE | addr;
420 err = mv88e6xxx_g2_eeprom_wait(chip);
424 err = mv88e6xxx_g2_write(chip, MV88E6352_G2_EEPROM_DATA, data);
428 return mv88e6xxx_g2_eeprom_cmd(chip, cmd);
431 int mv88e6xxx_g2_get_eeprom8(struct mv88e6xxx_chip *chip,
432 struct ethtool_eeprom *eeprom, u8 *data)
434 unsigned int offset = eeprom->offset;
435 unsigned int len = eeprom->len;
441 err = mv88e6xxx_g2_eeprom_read8(chip, offset, data);
454 int mv88e6xxx_g2_set_eeprom8(struct mv88e6xxx_chip *chip,
455 struct ethtool_eeprom *eeprom, u8 *data)
457 unsigned int offset = eeprom->offset;
458 unsigned int len = eeprom->len;
464 err = mv88e6xxx_g2_eeprom_write8(chip, offset, *data);
477 int mv88e6xxx_g2_get_eeprom16(struct mv88e6xxx_chip *chip,
478 struct ethtool_eeprom *eeprom, u8 *data)
480 unsigned int offset = eeprom->offset;
481 unsigned int len = eeprom->len;
488 err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
492 *data++ = (val >> 8) & 0xff;
500 err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
504 *data++ = val & 0xff;
505 *data++ = (val >> 8) & 0xff;
513 err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
517 *data++ = val & 0xff;
527 int mv88e6xxx_g2_set_eeprom16(struct mv88e6xxx_chip *chip,
528 struct ethtool_eeprom *eeprom, u8 *data)
530 unsigned int offset = eeprom->offset;
531 unsigned int len = eeprom->len;
535 /* Ensure the RO WriteEn bit is set */
536 err = mv88e6xxx_g2_read(chip, MV88E6XXX_G2_EEPROM_CMD, &val);
540 if (!(val & MV88E6XXX_G2_EEPROM_CMD_WRITE_EN))
546 err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
550 val = (*data++ << 8) | (val & 0xff);
552 err = mv88e6xxx_g2_eeprom_write16(chip, offset >> 1, val);
565 err = mv88e6xxx_g2_eeprom_write16(chip, offset >> 1, val);
575 err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
579 val = (val & 0xff00) | *data++;
581 err = mv88e6xxx_g2_eeprom_write16(chip, offset >> 1, val);
593 /* Offset 0x18: SMI PHY Command Register
594 * Offset 0x19: SMI PHY Data Register
597 static int mv88e6xxx_g2_smi_phy_wait(struct mv88e6xxx_chip *chip)
599 int bit = __bf_shf(MV88E6XXX_G2_SMI_PHY_CMD_BUSY);
601 return mv88e6xxx_g2_wait_bit(chip, MV88E6XXX_G2_SMI_PHY_CMD, bit, 0);
604 static int mv88e6xxx_g2_smi_phy_cmd(struct mv88e6xxx_chip *chip, u16 cmd)
608 err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SMI_PHY_CMD,
609 MV88E6XXX_G2_SMI_PHY_CMD_BUSY | cmd);
613 return mv88e6xxx_g2_smi_phy_wait(chip);
616 static int mv88e6xxx_g2_smi_phy_access(struct mv88e6xxx_chip *chip,
617 bool external, bool c45, u16 op, int dev,
623 cmd |= MV88E6390_G2_SMI_PHY_CMD_FUNC_EXTERNAL;
625 cmd |= MV88E6390_G2_SMI_PHY_CMD_FUNC_INTERNAL; /* empty mask */
628 cmd |= MV88E6XXX_G2_SMI_PHY_CMD_MODE_45; /* empty mask */
630 cmd |= MV88E6XXX_G2_SMI_PHY_CMD_MODE_22;
632 dev <<= __bf_shf(MV88E6XXX_G2_SMI_PHY_CMD_DEV_ADDR_MASK);
633 cmd |= dev & MV88E6XXX_G2_SMI_PHY_CMD_DEV_ADDR_MASK;
634 cmd |= reg & MV88E6XXX_G2_SMI_PHY_CMD_REG_ADDR_MASK;
636 return mv88e6xxx_g2_smi_phy_cmd(chip, cmd);
639 static int mv88e6xxx_g2_smi_phy_access_c22(struct mv88e6xxx_chip *chip,
640 bool external, u16 op, int dev,
643 return mv88e6xxx_g2_smi_phy_access(chip, external, false, op, dev, reg);
646 /* IEEE 802.3 Clause 22 Read Data Register */
647 static int mv88e6xxx_g2_smi_phy_read_data_c22(struct mv88e6xxx_chip *chip,
648 bool external, int dev, int reg,
651 u16 op = MV88E6XXX_G2_SMI_PHY_CMD_OP_22_READ_DATA;
654 err = mv88e6xxx_g2_smi_phy_wait(chip);
658 err = mv88e6xxx_g2_smi_phy_access_c22(chip, external, op, dev, reg);
662 return mv88e6xxx_g2_read(chip, MV88E6XXX_G2_SMI_PHY_DATA, data);
665 /* IEEE 802.3 Clause 22 Write Data Register */
666 static int mv88e6xxx_g2_smi_phy_write_data_c22(struct mv88e6xxx_chip *chip,
667 bool external, int dev, int reg,
670 u16 op = MV88E6XXX_G2_SMI_PHY_CMD_OP_22_WRITE_DATA;
673 err = mv88e6xxx_g2_smi_phy_wait(chip);
677 err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SMI_PHY_DATA, data);
681 return mv88e6xxx_g2_smi_phy_access_c22(chip, external, op, dev, reg);
684 static int mv88e6xxx_g2_smi_phy_access_c45(struct mv88e6xxx_chip *chip,
685 bool external, u16 op, int port,
688 return mv88e6xxx_g2_smi_phy_access(chip, external, true, op, port, dev);
691 /* IEEE 802.3 Clause 45 Write Address Register */
692 static int mv88e6xxx_g2_smi_phy_write_addr_c45(struct mv88e6xxx_chip *chip,
693 bool external, int port, int dev,
696 u16 op = MV88E6XXX_G2_SMI_PHY_CMD_OP_45_WRITE_ADDR;
699 err = mv88e6xxx_g2_smi_phy_wait(chip);
703 err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SMI_PHY_DATA, addr);
707 return mv88e6xxx_g2_smi_phy_access_c45(chip, external, op, port, dev);
710 /* IEEE 802.3 Clause 45 Read Data Register */
711 static int mv88e6xxx_g2_smi_phy_read_data_c45(struct mv88e6xxx_chip *chip,
712 bool external, int port, int dev,
715 u16 op = MV88E6XXX_G2_SMI_PHY_CMD_OP_45_READ_DATA;
718 err = mv88e6xxx_g2_smi_phy_access_c45(chip, external, op, port, dev);
722 return mv88e6xxx_g2_read(chip, MV88E6XXX_G2_SMI_PHY_DATA, data);
725 static int mv88e6xxx_g2_smi_phy_read_c45(struct mv88e6xxx_chip *chip,
726 bool external, int port, int reg,
729 int dev = (reg >> 16) & 0x1f;
730 int addr = reg & 0xffff;
733 err = mv88e6xxx_g2_smi_phy_write_addr_c45(chip, external, port, dev,
738 return mv88e6xxx_g2_smi_phy_read_data_c45(chip, external, port, dev,
742 /* IEEE 802.3 Clause 45 Write Data Register */
743 static int mv88e6xxx_g2_smi_phy_write_data_c45(struct mv88e6xxx_chip *chip,
744 bool external, int port, int dev,
747 u16 op = MV88E6XXX_G2_SMI_PHY_CMD_OP_45_WRITE_DATA;
750 err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SMI_PHY_DATA, data);
754 return mv88e6xxx_g2_smi_phy_access_c45(chip, external, op, port, dev);
757 static int mv88e6xxx_g2_smi_phy_write_c45(struct mv88e6xxx_chip *chip,
758 bool external, int port, int reg,
761 int dev = (reg >> 16) & 0x1f;
762 int addr = reg & 0xffff;
765 err = mv88e6xxx_g2_smi_phy_write_addr_c45(chip, external, port, dev,
770 return mv88e6xxx_g2_smi_phy_write_data_c45(chip, external, port, dev,
774 int mv88e6xxx_g2_smi_phy_read(struct mv88e6xxx_chip *chip, struct mii_bus *bus,
775 int addr, int reg, u16 *val)
777 struct mv88e6xxx_mdio_bus *mdio_bus = bus->priv;
778 bool external = mdio_bus->external;
780 if (reg & MII_ADDR_C45)
781 return mv88e6xxx_g2_smi_phy_read_c45(chip, external, addr, reg,
784 return mv88e6xxx_g2_smi_phy_read_data_c22(chip, external, addr, reg,
788 int mv88e6xxx_g2_smi_phy_write(struct mv88e6xxx_chip *chip, struct mii_bus *bus,
789 int addr, int reg, u16 val)
791 struct mv88e6xxx_mdio_bus *mdio_bus = bus->priv;
792 bool external = mdio_bus->external;
794 if (reg & MII_ADDR_C45)
795 return mv88e6xxx_g2_smi_phy_write_c45(chip, external, addr, reg,
798 return mv88e6xxx_g2_smi_phy_write_data_c22(chip, external, addr, reg,
802 /* Offset 0x1B: Watchdog Control */
803 static int mv88e6097_watchdog_action(struct mv88e6xxx_chip *chip, int irq)
807 mv88e6xxx_g2_read(chip, MV88E6352_G2_WDOG_CTL, ®);
809 dev_info(chip->dev, "Watchdog event: 0x%04x", reg);
814 static void mv88e6097_watchdog_free(struct mv88e6xxx_chip *chip)
818 mv88e6xxx_g2_read(chip, MV88E6352_G2_WDOG_CTL, ®);
820 reg &= ~(MV88E6352_G2_WDOG_CTL_EGRESS_ENABLE |
821 MV88E6352_G2_WDOG_CTL_QC_ENABLE);
823 mv88e6xxx_g2_write(chip, MV88E6352_G2_WDOG_CTL, reg);
826 static int mv88e6097_watchdog_setup(struct mv88e6xxx_chip *chip)
828 return mv88e6xxx_g2_write(chip, MV88E6352_G2_WDOG_CTL,
829 MV88E6352_G2_WDOG_CTL_EGRESS_ENABLE |
830 MV88E6352_G2_WDOG_CTL_QC_ENABLE |
831 MV88E6352_G2_WDOG_CTL_SWRESET);
834 const struct mv88e6xxx_irq_ops mv88e6097_watchdog_ops = {
835 .irq_action = mv88e6097_watchdog_action,
836 .irq_setup = mv88e6097_watchdog_setup,
837 .irq_free = mv88e6097_watchdog_free,
840 static void mv88e6250_watchdog_free(struct mv88e6xxx_chip *chip)
844 mv88e6xxx_g2_read(chip, MV88E6250_G2_WDOG_CTL, ®);
846 reg &= ~(MV88E6250_G2_WDOG_CTL_EGRESS_ENABLE |
847 MV88E6250_G2_WDOG_CTL_QC_ENABLE);
849 mv88e6xxx_g2_write(chip, MV88E6250_G2_WDOG_CTL, reg);
852 static int mv88e6250_watchdog_setup(struct mv88e6xxx_chip *chip)
854 return mv88e6xxx_g2_write(chip, MV88E6250_G2_WDOG_CTL,
855 MV88E6250_G2_WDOG_CTL_EGRESS_ENABLE |
856 MV88E6250_G2_WDOG_CTL_QC_ENABLE |
857 MV88E6250_G2_WDOG_CTL_SWRESET);
860 const struct mv88e6xxx_irq_ops mv88e6250_watchdog_ops = {
861 .irq_action = mv88e6097_watchdog_action,
862 .irq_setup = mv88e6250_watchdog_setup,
863 .irq_free = mv88e6250_watchdog_free,
866 static int mv88e6390_watchdog_setup(struct mv88e6xxx_chip *chip)
868 return mv88e6xxx_g2_write(chip, MV88E6390_G2_WDOG_CTL,
869 MV88E6390_G2_WDOG_CTL_UPDATE |
870 MV88E6390_G2_WDOG_CTL_PTR_INT_ENABLE |
871 MV88E6390_G2_WDOG_CTL_CUT_THROUGH |
872 MV88E6390_G2_WDOG_CTL_QUEUE_CONTROLLER |
873 MV88E6390_G2_WDOG_CTL_EGRESS |
874 MV88E6390_G2_WDOG_CTL_FORCE_IRQ);
877 static int mv88e6390_watchdog_action(struct mv88e6xxx_chip *chip, int irq)
881 mv88e6xxx_g2_write(chip, MV88E6390_G2_WDOG_CTL,
882 MV88E6390_G2_WDOG_CTL_PTR_EVENT);
883 mv88e6xxx_g2_read(chip, MV88E6390_G2_WDOG_CTL, ®);
885 dev_info(chip->dev, "Watchdog event: 0x%04x",
886 reg & MV88E6390_G2_WDOG_CTL_DATA_MASK);
888 mv88e6xxx_g2_write(chip, MV88E6390_G2_WDOG_CTL,
889 MV88E6390_G2_WDOG_CTL_PTR_HISTORY);
890 mv88e6xxx_g2_read(chip, MV88E6390_G2_WDOG_CTL, ®);
892 dev_info(chip->dev, "Watchdog history: 0x%04x",
893 reg & MV88E6390_G2_WDOG_CTL_DATA_MASK);
895 /* Trigger a software reset to try to recover the switch */
896 if (chip->info->ops->reset)
897 chip->info->ops->reset(chip);
899 mv88e6390_watchdog_setup(chip);
904 static void mv88e6390_watchdog_free(struct mv88e6xxx_chip *chip)
906 mv88e6xxx_g2_write(chip, MV88E6390_G2_WDOG_CTL,
907 MV88E6390_G2_WDOG_CTL_UPDATE |
908 MV88E6390_G2_WDOG_CTL_PTR_INT_ENABLE);
911 const struct mv88e6xxx_irq_ops mv88e6390_watchdog_ops = {
912 .irq_action = mv88e6390_watchdog_action,
913 .irq_setup = mv88e6390_watchdog_setup,
914 .irq_free = mv88e6390_watchdog_free,
917 static irqreturn_t mv88e6xxx_g2_watchdog_thread_fn(int irq, void *dev_id)
919 struct mv88e6xxx_chip *chip = dev_id;
920 irqreturn_t ret = IRQ_NONE;
922 mv88e6xxx_reg_lock(chip);
923 if (chip->info->ops->watchdog_ops->irq_action)
924 ret = chip->info->ops->watchdog_ops->irq_action(chip, irq);
925 mv88e6xxx_reg_unlock(chip);
930 static void mv88e6xxx_g2_watchdog_free(struct mv88e6xxx_chip *chip)
932 mv88e6xxx_reg_lock(chip);
933 if (chip->info->ops->watchdog_ops->irq_free)
934 chip->info->ops->watchdog_ops->irq_free(chip);
935 mv88e6xxx_reg_unlock(chip);
937 free_irq(chip->watchdog_irq, chip);
938 irq_dispose_mapping(chip->watchdog_irq);
941 static int mv88e6xxx_g2_watchdog_setup(struct mv88e6xxx_chip *chip)
945 chip->watchdog_irq = irq_find_mapping(chip->g2_irq.domain,
946 MV88E6XXX_G2_INT_SOURCE_WATCHDOG);
947 if (chip->watchdog_irq < 0)
948 return chip->watchdog_irq;
950 snprintf(chip->watchdog_irq_name, sizeof(chip->watchdog_irq_name),
951 "mv88e6xxx-%s-watchdog", dev_name(chip->dev));
953 err = request_threaded_irq(chip->watchdog_irq, NULL,
954 mv88e6xxx_g2_watchdog_thread_fn,
955 IRQF_ONESHOT | IRQF_TRIGGER_FALLING,
956 chip->watchdog_irq_name, chip);
960 mv88e6xxx_reg_lock(chip);
961 if (chip->info->ops->watchdog_ops->irq_setup)
962 err = chip->info->ops->watchdog_ops->irq_setup(chip);
963 mv88e6xxx_reg_unlock(chip);
968 /* Offset 0x1D: Misc Register */
970 static int mv88e6xxx_g2_misc_5_bit_port(struct mv88e6xxx_chip *chip,
976 err = mv88e6xxx_g2_read(chip, MV88E6XXX_G2_MISC, &val);
981 val |= MV88E6XXX_G2_MISC_5_BIT_PORT;
983 val &= ~MV88E6XXX_G2_MISC_5_BIT_PORT;
985 return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_MISC, val);
988 int mv88e6xxx_g2_misc_4_bit_port(struct mv88e6xxx_chip *chip)
990 return mv88e6xxx_g2_misc_5_bit_port(chip, false);
993 static void mv88e6xxx_g2_irq_mask(struct irq_data *d)
995 struct mv88e6xxx_chip *chip = irq_data_get_irq_chip_data(d);
996 unsigned int n = d->hwirq;
998 chip->g2_irq.masked |= (1 << n);
1001 static void mv88e6xxx_g2_irq_unmask(struct irq_data *d)
1003 struct mv88e6xxx_chip *chip = irq_data_get_irq_chip_data(d);
1004 unsigned int n = d->hwirq;
1006 chip->g2_irq.masked &= ~(1 << n);
1009 static irqreturn_t mv88e6xxx_g2_irq_thread_fn(int irq, void *dev_id)
1011 struct mv88e6xxx_chip *chip = dev_id;
1012 unsigned int nhandled = 0;
1013 unsigned int sub_irq;
1018 mv88e6xxx_reg_lock(chip);
1019 err = mv88e6xxx_g2_int_source(chip, ®);
1020 mv88e6xxx_reg_unlock(chip);
1024 for (n = 0; n < 16; ++n) {
1025 if (reg & (1 << n)) {
1026 sub_irq = irq_find_mapping(chip->g2_irq.domain, n);
1027 handle_nested_irq(sub_irq);
1032 return (nhandled > 0 ? IRQ_HANDLED : IRQ_NONE);
1035 static void mv88e6xxx_g2_irq_bus_lock(struct irq_data *d)
1037 struct mv88e6xxx_chip *chip = irq_data_get_irq_chip_data(d);
1039 mv88e6xxx_reg_lock(chip);
1042 static void mv88e6xxx_g2_irq_bus_sync_unlock(struct irq_data *d)
1044 struct mv88e6xxx_chip *chip = irq_data_get_irq_chip_data(d);
1047 err = mv88e6xxx_g2_int_mask(chip, ~chip->g2_irq.masked);
1049 dev_err(chip->dev, "failed to mask interrupts\n");
1051 mv88e6xxx_reg_unlock(chip);
1054 static const struct irq_chip mv88e6xxx_g2_irq_chip = {
1055 .name = "mv88e6xxx-g2",
1056 .irq_mask = mv88e6xxx_g2_irq_mask,
1057 .irq_unmask = mv88e6xxx_g2_irq_unmask,
1058 .irq_bus_lock = mv88e6xxx_g2_irq_bus_lock,
1059 .irq_bus_sync_unlock = mv88e6xxx_g2_irq_bus_sync_unlock,
1062 static int mv88e6xxx_g2_irq_domain_map(struct irq_domain *d,
1064 irq_hw_number_t hwirq)
1066 struct mv88e6xxx_chip *chip = d->host_data;
1068 irq_set_chip_data(irq, d->host_data);
1069 irq_set_chip_and_handler(irq, &chip->g2_irq.chip, handle_level_irq);
1070 irq_set_noprobe(irq);
1075 static const struct irq_domain_ops mv88e6xxx_g2_irq_domain_ops = {
1076 .map = mv88e6xxx_g2_irq_domain_map,
1077 .xlate = irq_domain_xlate_twocell,
1080 void mv88e6xxx_g2_irq_free(struct mv88e6xxx_chip *chip)
1084 mv88e6xxx_g2_watchdog_free(chip);
1086 free_irq(chip->device_irq, chip);
1087 irq_dispose_mapping(chip->device_irq);
1089 for (irq = 0; irq < 16; irq++) {
1090 virq = irq_find_mapping(chip->g2_irq.domain, irq);
1091 irq_dispose_mapping(virq);
1094 irq_domain_remove(chip->g2_irq.domain);
1097 int mv88e6xxx_g2_irq_setup(struct mv88e6xxx_chip *chip)
1101 chip->g2_irq.masked = ~0;
1102 mv88e6xxx_reg_lock(chip);
1103 err = mv88e6xxx_g2_int_mask(chip, ~chip->g2_irq.masked);
1104 mv88e6xxx_reg_unlock(chip);
1108 chip->g2_irq.domain = irq_domain_add_simple(
1109 chip->dev->of_node, 16, 0, &mv88e6xxx_g2_irq_domain_ops, chip);
1110 if (!chip->g2_irq.domain)
1113 for (irq = 0; irq < 16; irq++)
1114 irq_create_mapping(chip->g2_irq.domain, irq);
1116 chip->g2_irq.chip = mv88e6xxx_g2_irq_chip;
1118 chip->device_irq = irq_find_mapping(chip->g1_irq.domain,
1119 MV88E6XXX_G1_STS_IRQ_DEVICE);
1120 if (chip->device_irq < 0) {
1121 err = chip->device_irq;
1125 snprintf(chip->device_irq_name, sizeof(chip->device_irq_name),
1126 "mv88e6xxx-%s-g2", dev_name(chip->dev));
1128 err = request_threaded_irq(chip->device_irq, NULL,
1129 mv88e6xxx_g2_irq_thread_fn,
1130 IRQF_ONESHOT, chip->device_irq_name, chip);
1134 return mv88e6xxx_g2_watchdog_setup(chip);
1137 for (irq = 0; irq < 16; irq++) {
1138 virq = irq_find_mapping(chip->g2_irq.domain, irq);
1139 irq_dispose_mapping(virq);
1142 irq_domain_remove(chip->g2_irq.domain);
1147 int mv88e6xxx_g2_irq_mdio_setup(struct mv88e6xxx_chip *chip,
1148 struct mii_bus *bus)
1150 int phy, irq, err, err_phy;
1152 for (phy = 0; phy < chip->info->num_internal_phys; phy++) {
1153 irq = irq_find_mapping(chip->g2_irq.domain, phy);
1158 bus->irq[chip->info->phy_base_addr + phy] = irq;
1164 for (phy = 0; phy < err_phy; phy++)
1165 irq_dispose_mapping(bus->irq[phy]);
1170 void mv88e6xxx_g2_irq_mdio_free(struct mv88e6xxx_chip *chip,
1171 struct mii_bus *bus)
1175 for (phy = 0; phy < chip->info->num_internal_phys; phy++)
1176 irq_dispose_mapping(bus->irq[phy]);