Skip to content

Commit 6f88284

Browse files
lunndavem330
authored andcommitted
net: dsa: mv88e6xxx: Add MDIO interrupts for internal PHYs
When registering an MDIO bus, it is possible to pass an array of interrupts, one per address on the bus. phylib will then associate the interrupt to the PHY device, if no other interrupt is provided. Some of the global2 interrupts are PHY interrupts. Place them into the MDIO bus structure. Signed-off-by: Andrew Lunn <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent bc39315 commit 6f88284

File tree

3 files changed

+58
-0
lines changed

3 files changed

+58
-0
lines changed

drivers/net/dsa/mv88e6xxx/chip.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2293,12 +2293,19 @@ static int mv88e6xxx_mdio_register(struct mv88e6xxx_chip *chip,
22932293
bus->write = mv88e6xxx_mdio_write;
22942294
bus->parent = chip->dev;
22952295

2296+
if (!external) {
2297+
err = mv88e6xxx_g2_irq_mdio_setup(chip, bus);
2298+
if (err)
2299+
return err;
2300+
}
2301+
22962302
if (np)
22972303
err = of_mdiobus_register(bus, np);
22982304
else
22992305
err = mdiobus_register(bus);
23002306
if (err) {
23012307
dev_err(chip->dev, "Cannot register MDIO bus (%d)\n", err);
2308+
mv88e6xxx_g2_irq_mdio_free(chip, bus);
23022309
return err;
23032310
}
23042311

@@ -2325,6 +2332,9 @@ static void mv88e6xxx_mdios_unregister(struct mv88e6xxx_chip *chip)
23252332
list_for_each_entry(mdio_bus, &chip->mdios, list) {
23262333
bus = mdio_bus->bus;
23272334

2335+
if (!mdio_bus->external)
2336+
mv88e6xxx_g2_irq_mdio_free(chip, bus);
2337+
23282338
mdiobus_unregister(bus);
23292339
}
23302340
}

drivers/net/dsa/mv88e6xxx/global2.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,6 +1107,38 @@ int mv88e6xxx_g2_irq_setup(struct mv88e6xxx_chip *chip)
11071107
return err;
11081108
}
11091109

1110+
int mv88e6xxx_g2_irq_mdio_setup(struct mv88e6xxx_chip *chip,
1111+
struct mii_bus *bus)
1112+
{
1113+
int phy, irq, err, err_phy;
1114+
1115+
for (phy = 0; phy < chip->info->num_internal_phys; phy++) {
1116+
irq = irq_find_mapping(chip->g2_irq.domain, phy);
1117+
if (irq < 0) {
1118+
err = irq;
1119+
goto out;
1120+
}
1121+
bus->irq[chip->info->port_base_addr + phy] = irq;
1122+
}
1123+
return 0;
1124+
out:
1125+
err_phy = phy;
1126+
1127+
for (phy = 0; phy < err_phy; phy++)
1128+
irq_dispose_mapping(bus->irq[phy]);
1129+
1130+
return err;
1131+
}
1132+
1133+
void mv88e6xxx_g2_irq_mdio_free(struct mv88e6xxx_chip *chip,
1134+
struct mii_bus *bus)
1135+
{
1136+
int phy;
1137+
1138+
for (phy = 0; phy < chip->info->num_internal_phys; phy++)
1139+
irq_dispose_mapping(bus->irq[phy]);
1140+
}
1141+
11101142
int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip)
11111143
{
11121144
u16 reg;

drivers/net/dsa/mv88e6xxx/global2.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,11 @@ int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip);
317317
int mv88e6xxx_g2_irq_setup(struct mv88e6xxx_chip *chip);
318318
void mv88e6xxx_g2_irq_free(struct mv88e6xxx_chip *chip);
319319

320+
int mv88e6xxx_g2_irq_mdio_setup(struct mv88e6xxx_chip *chip,
321+
struct mii_bus *bus);
322+
void mv88e6xxx_g2_irq_mdio_free(struct mv88e6xxx_chip *chip,
323+
struct mii_bus *bus);
324+
320325
int mv88e6185_g2_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip);
321326
int mv88e6352_g2_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip);
322327

@@ -450,6 +455,17 @@ static inline void mv88e6xxx_g2_irq_free(struct mv88e6xxx_chip *chip)
450455
{
451456
}
452457

458+
static inline int mv88e6xxx_g2_irq_mdio_setup(struct mv88e6xxx_chip *chip,
459+
struct mii_bus *bus)
460+
{
461+
return 0;
462+
}
463+
464+
static inline void mv88e6xxx_g2_irq_mdio_free(struct mv88e6xxx_chip *chip,
465+
struct mii_bus *bus)
466+
{
467+
}
468+
453469
static inline int mv88e6185_g2_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip)
454470
{
455471
return -EOPNOTSUPP;

0 commit comments

Comments
 (0)