aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/dsa
diff options
context:
space:
mode:
authorVivien Didelot <vivien.didelot@savoirfairelinux.com>2016-08-15 17:19:02 -0400
committerDavid S. Miller <davem@davemloft.net>2016-08-15 19:43:56 -0400
commit9c93829c014f1a18a4aac2bf15b79ff4325a0912 (patch)
tree763c6a44a85c3b884d30adafac13a2f69ee6427f /drivers/net/dsa
parent09cb7dfd3f144d18168e27b35361e9024763db15 (diff)
net: dsa: mv88e6xxx: use the new PHY API
This commit replaces every MDIO direct or indirect access with the new generic mv88e6xxx_phy_* routines. This allows us to get rid of the mv88e6xxx_mdio_{read,write}_{,in}direct and {_,}mv88e6xxx_mdio_page_{read,write} functions. Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/dsa')
-rw-r--r--drivers/net/dsa/mv88e6xxx/chip.c185
1 files changed, 50 insertions, 135 deletions
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index faa07513c9ff..a230fcba5b64 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -372,22 +372,6 @@ static int _mv88e6xxx_reg_write(struct mv88e6xxx_chip *chip, int addr,
372 return mv88e6xxx_write(chip, addr, reg, val); 372 return mv88e6xxx_write(chip, addr, reg, val);
373} 373}
374 374
375static int mv88e6xxx_mdio_read_direct(struct mv88e6xxx_chip *chip,
376 int addr, int regnum)
377{
378 if (addr >= 0)
379 return _mv88e6xxx_reg_read(chip, addr, regnum);
380 return 0xffff;
381}
382
383static int mv88e6xxx_mdio_write_direct(struct mv88e6xxx_chip *chip,
384 int addr, int regnum, u16 val)
385{
386 if (addr >= 0)
387 return _mv88e6xxx_reg_write(chip, addr, regnum, val);
388 return 0;
389}
390
391static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip) 375static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
392{ 376{
393 int ret; 377 int ret;
@@ -942,87 +926,63 @@ static int _mv88e6xxx_atu_wait(struct mv88e6xxx_chip *chip)
942 GLOBAL_ATU_OP_BUSY); 926 GLOBAL_ATU_OP_BUSY);
943} 927}
944 928
945static int mv88e6xxx_g2_smi_phy_read(struct mv88e6xxx_chip *chip, int addr,
946 int reg, u16 *val);
947static int mv88e6xxx_g2_smi_phy_write(struct mv88e6xxx_chip *chip, int addr,
948 int reg, u16 val);
949
950static int mv88e6xxx_mdio_read_indirect(struct mv88e6xxx_chip *chip,
951 int addr, int regnum)
952{
953 u16 val;
954 int err;
955
956 err = mv88e6xxx_g2_smi_phy_read(chip, addr, regnum, &val);
957 if (err)
958 return err;
959
960 return val;
961}
962
963static int mv88e6xxx_mdio_write_indirect(struct mv88e6xxx_chip *chip,
964 int addr, int regnum, u16 val)
965{
966 return mv88e6xxx_g2_smi_phy_write(chip, addr, regnum, val);
967}
968
969static int mv88e6xxx_get_eee(struct dsa_switch *ds, int port, 929static int mv88e6xxx_get_eee(struct dsa_switch *ds, int port,
970 struct ethtool_eee *e) 930 struct ethtool_eee *e)
971{ 931{
972 struct mv88e6xxx_chip *chip = ds_to_priv(ds); 932 struct mv88e6xxx_chip *chip = ds_to_priv(ds);
973 int reg; 933 u16 reg;
934 int err;
974 935
975 if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE)) 936 if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
976 return -EOPNOTSUPP; 937 return -EOPNOTSUPP;
977 938
978 mutex_lock(&chip->reg_lock); 939 mutex_lock(&chip->reg_lock);
979 940
980 reg = mv88e6xxx_mdio_read_indirect(chip, port, 16); 941 err = mv88e6xxx_phy_read(chip, port, 16, &reg);
981 if (reg < 0) 942 if (err)
982 goto out; 943 goto out;
983 944
984 e->eee_enabled = !!(reg & 0x0200); 945 e->eee_enabled = !!(reg & 0x0200);
985 e->tx_lpi_enabled = !!(reg & 0x0100); 946 e->tx_lpi_enabled = !!(reg & 0x0100);
986 947
987 reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_STATUS); 948 err = mv88e6xxx_read(chip, REG_PORT(port), PORT_STATUS, &reg);
988 if (reg < 0) 949 if (err)
989 goto out; 950 goto out;
990 951
991 e->eee_active = !!(reg & PORT_STATUS_EEE); 952 e->eee_active = !!(reg & PORT_STATUS_EEE);
992 reg = 0;
993
994out: 953out:
995 mutex_unlock(&chip->reg_lock); 954 mutex_unlock(&chip->reg_lock);
996 return reg; 955
956 return err;
997} 957}
998 958
999static int mv88e6xxx_set_eee(struct dsa_switch *ds, int port, 959static int mv88e6xxx_set_eee(struct dsa_switch *ds, int port,
1000 struct phy_device *phydev, struct ethtool_eee *e) 960 struct phy_device *phydev, struct ethtool_eee *e)
1001{ 961{
1002 struct mv88e6xxx_chip *chip = ds_to_priv(ds); 962 struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1003 int reg; 963 u16 reg;
1004 int ret; 964 int err;
1005 965
1006 if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE)) 966 if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
1007 return -EOPNOTSUPP; 967 return -EOPNOTSUPP;
1008 968
1009 mutex_lock(&chip->reg_lock); 969 mutex_lock(&chip->reg_lock);
1010 970
1011 ret = mv88e6xxx_mdio_read_indirect(chip, port, 16); 971 err = mv88e6xxx_phy_read(chip, port, 16, &reg);
1012 if (ret < 0) 972 if (err)
1013 goto out; 973 goto out;
1014 974
1015 reg = ret & ~0x0300; 975 reg &= ~0x0300;
1016 if (e->eee_enabled) 976 if (e->eee_enabled)
1017 reg |= 0x0200; 977 reg |= 0x0200;
1018 if (e->tx_lpi_enabled) 978 if (e->tx_lpi_enabled)
1019 reg |= 0x0100; 979 reg |= 0x0100;
1020 980
1021 ret = mv88e6xxx_mdio_write_indirect(chip, port, 16, reg); 981 err = mv88e6xxx_phy_write(chip, port, 16, reg);
1022out: 982out:
1023 mutex_unlock(&chip->reg_lock); 983 mutex_unlock(&chip->reg_lock);
1024 984
1025 return ret; 985 return err;
1026} 986}
1027 987
1028static int _mv88e6xxx_atu_cmd(struct mv88e6xxx_chip *chip, u16 fid, u16 cmd) 988static int _mv88e6xxx_atu_cmd(struct mv88e6xxx_chip *chip, u16 fid, u16 cmd)
@@ -2382,38 +2342,6 @@ static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port)
2382 mutex_unlock(&chip->reg_lock); 2342 mutex_unlock(&chip->reg_lock);
2383} 2343}
2384 2344
2385static int _mv88e6xxx_mdio_page_write(struct mv88e6xxx_chip *chip,
2386 int port, int page, int reg, int val)
2387{
2388 int ret;
2389
2390 ret = mv88e6xxx_mdio_write_indirect(chip, port, 0x16, page);
2391 if (ret < 0)
2392 goto restore_page_0;
2393
2394 ret = mv88e6xxx_mdio_write_indirect(chip, port, reg, val);
2395restore_page_0:
2396 mv88e6xxx_mdio_write_indirect(chip, port, 0x16, 0x0);
2397
2398 return ret;
2399}
2400
2401static int _mv88e6xxx_mdio_page_read(struct mv88e6xxx_chip *chip,
2402 int port, int page, int reg)
2403{
2404 int ret;
2405
2406 ret = mv88e6xxx_mdio_write_indirect(chip, port, 0x16, page);
2407 if (ret < 0)
2408 goto restore_page_0;
2409
2410 ret = mv88e6xxx_mdio_read_indirect(chip, port, reg);
2411restore_page_0:
2412 mv88e6xxx_mdio_write_indirect(chip, port, 0x16, 0x0);
2413
2414 return ret;
2415}
2416
2417static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip) 2345static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip)
2418{ 2346{
2419 bool ppu_active = mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE); 2347 bool ppu_active = mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE);
@@ -3322,32 +3250,6 @@ static int mv88e6xxx_set_addr(struct dsa_switch *ds, u8 *addr)
3322 return err; 3250 return err;
3323} 3251}
3324 3252
3325static int mv88e6xxx_mdio_page_read(struct dsa_switch *ds, int port, int page,
3326 int reg)
3327{
3328 struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3329 int ret;
3330
3331 mutex_lock(&chip->reg_lock);
3332 ret = _mv88e6xxx_mdio_page_read(chip, port, page, reg);
3333 mutex_unlock(&chip->reg_lock);
3334
3335 return ret;
3336}
3337
3338static int mv88e6xxx_mdio_page_write(struct dsa_switch *ds, int port, int page,
3339 int reg, int val)
3340{
3341 struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3342 int ret;
3343
3344 mutex_lock(&chip->reg_lock);
3345 ret = _mv88e6xxx_mdio_page_write(chip, port, page, reg, val);
3346 mutex_unlock(&chip->reg_lock);
3347
3348 return ret;
3349}
3350
3351static int mv88e6xxx_mdio_read(struct mii_bus *bus, int phy, int reg) 3253static int mv88e6xxx_mdio_read(struct mii_bus *bus, int phy, int reg)
3352{ 3254{
3353 struct mv88e6xxx_chip *chip = bus->priv; 3255 struct mv88e6xxx_chip *chip = bus->priv;
@@ -3441,44 +3343,42 @@ static void mv88e6xxx_mdio_unregister(struct mv88e6xxx_chip *chip)
3441static int mv88e61xx_get_temp(struct dsa_switch *ds, int *temp) 3343static int mv88e61xx_get_temp(struct dsa_switch *ds, int *temp)
3442{ 3344{
3443 struct mv88e6xxx_chip *chip = ds_to_priv(ds); 3345 struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3346 u16 val;
3444 int ret; 3347 int ret;
3445 int val;
3446 3348
3447 *temp = 0; 3349 *temp = 0;
3448 3350
3449 mutex_lock(&chip->reg_lock); 3351 mutex_lock(&chip->reg_lock);
3450 3352
3451 ret = mv88e6xxx_mdio_write_direct(chip, 0x0, 0x16, 0x6); 3353 ret = mv88e6xxx_phy_write(chip, 0x0, 0x16, 0x6);
3452 if (ret < 0) 3354 if (ret < 0)
3453 goto error; 3355 goto error;
3454 3356
3455 /* Enable temperature sensor */ 3357 /* Enable temperature sensor */
3456 ret = mv88e6xxx_mdio_read_direct(chip, 0x0, 0x1a); 3358 ret = mv88e6xxx_phy_read(chip, 0x0, 0x1a, &val);
3457 if (ret < 0) 3359 if (ret < 0)
3458 goto error; 3360 goto error;
3459 3361
3460 ret = mv88e6xxx_mdio_write_direct(chip, 0x0, 0x1a, ret | (1 << 5)); 3362 ret = mv88e6xxx_phy_write(chip, 0x0, 0x1a, val | (1 << 5));
3461 if (ret < 0) 3363 if (ret < 0)
3462 goto error; 3364 goto error;
3463 3365
3464 /* Wait for temperature to stabilize */ 3366 /* Wait for temperature to stabilize */
3465 usleep_range(10000, 12000); 3367 usleep_range(10000, 12000);
3466 3368
3467 val = mv88e6xxx_mdio_read_direct(chip, 0x0, 0x1a); 3369 ret = mv88e6xxx_phy_read(chip, 0x0, 0x1a, &val);
3468 if (val < 0) { 3370 if (ret < 0)
3469 ret = val;
3470 goto error; 3371 goto error;
3471 }
3472 3372
3473 /* Disable temperature sensor */ 3373 /* Disable temperature sensor */
3474 ret = mv88e6xxx_mdio_write_direct(chip, 0x0, 0x1a, ret & ~(1 << 5)); 3374 ret = mv88e6xxx_phy_write(chip, 0x0, 0x1a, val & ~(1 << 5));
3475 if (ret < 0) 3375 if (ret < 0)
3476 goto error; 3376 goto error;
3477 3377
3478 *temp = ((val & 0x1f) - 5) * 5; 3378 *temp = ((val & 0x1f) - 5) * 5;
3479 3379
3480error: 3380error:
3481 mv88e6xxx_mdio_write_direct(chip, 0x0, 0x16, 0x0); 3381 mv88e6xxx_phy_write(chip, 0x0, 0x16, 0x0);
3482 mutex_unlock(&chip->reg_lock); 3382 mutex_unlock(&chip->reg_lock);
3483 return ret; 3383 return ret;
3484} 3384}
@@ -3487,15 +3387,18 @@ static int mv88e63xx_get_temp(struct dsa_switch *ds, int *temp)
3487{ 3387{
3488 struct mv88e6xxx_chip *chip = ds_to_priv(ds); 3388 struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3489 int phy = mv88e6xxx_6320_family(chip) ? 3 : 0; 3389 int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3390 u16 val;
3490 int ret; 3391 int ret;
3491 3392
3492 *temp = 0; 3393 *temp = 0;
3493 3394
3494 ret = mv88e6xxx_mdio_page_read(ds, phy, 6, 27); 3395 mutex_lock(&chip->reg_lock);
3396 ret = mv88e6xxx_phy_page_read(chip, phy, 6, 27, &val);
3397 mutex_unlock(&chip->reg_lock);
3495 if (ret < 0) 3398 if (ret < 0)
3496 return ret; 3399 return ret;
3497 3400
3498 *temp = (ret & 0xff) - 25; 3401 *temp = (val & 0xff) - 25;
3499 3402
3500 return 0; 3403 return 0;
3501} 3404}
@@ -3517,6 +3420,7 @@ static int mv88e6xxx_get_temp_limit(struct dsa_switch *ds, int *temp)
3517{ 3420{
3518 struct mv88e6xxx_chip *chip = ds_to_priv(ds); 3421 struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3519 int phy = mv88e6xxx_6320_family(chip) ? 3 : 0; 3422 int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3423 u16 val;
3520 int ret; 3424 int ret;
3521 3425
3522 if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT)) 3426 if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
@@ -3524,11 +3428,13 @@ static int mv88e6xxx_get_temp_limit(struct dsa_switch *ds, int *temp)
3524 3428
3525 *temp = 0; 3429 *temp = 0;
3526 3430
3527 ret = mv88e6xxx_mdio_page_read(ds, phy, 6, 26); 3431 mutex_lock(&chip->reg_lock);
3432 ret = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
3433 mutex_unlock(&chip->reg_lock);
3528 if (ret < 0) 3434 if (ret < 0)
3529 return ret; 3435 return ret;
3530 3436
3531 *temp = (((ret >> 8) & 0x1f) * 5) - 25; 3437 *temp = (((val >> 8) & 0x1f) * 5) - 25;
3532 3438
3533 return 0; 3439 return 0;
3534} 3440}
@@ -3537,23 +3443,30 @@ static int mv88e6xxx_set_temp_limit(struct dsa_switch *ds, int temp)
3537{ 3443{
3538 struct mv88e6xxx_chip *chip = ds_to_priv(ds); 3444 struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3539 int phy = mv88e6xxx_6320_family(chip) ? 3 : 0; 3445 int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3540 int ret; 3446 u16 val;
3447 int err;
3541 3448
3542 if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT)) 3449 if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3543 return -EOPNOTSUPP; 3450 return -EOPNOTSUPP;
3544 3451
3545 ret = mv88e6xxx_mdio_page_read(ds, phy, 6, 26); 3452 mutex_lock(&chip->reg_lock);
3546 if (ret < 0) 3453 err = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
3547 return ret; 3454 if (err)
3455 goto unlock;
3548 temp = clamp_val(DIV_ROUND_CLOSEST(temp, 5) + 5, 0, 0x1f); 3456 temp = clamp_val(DIV_ROUND_CLOSEST(temp, 5) + 5, 0, 0x1f);
3549 return mv88e6xxx_mdio_page_write(ds, phy, 6, 26, 3457 err = mv88e6xxx_phy_page_write(chip, phy, 6, 26,
3550 (ret & 0xe0ff) | (temp << 8)); 3458 (val & 0xe0ff) | (temp << 8));
3459unlock:
3460 mutex_unlock(&chip->reg_lock);
3461
3462 return err;
3551} 3463}
3552 3464
3553static int mv88e6xxx_get_temp_alarm(struct dsa_switch *ds, bool *alarm) 3465static int mv88e6xxx_get_temp_alarm(struct dsa_switch *ds, bool *alarm)
3554{ 3466{
3555 struct mv88e6xxx_chip *chip = ds_to_priv(ds); 3467 struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3556 int phy = mv88e6xxx_6320_family(chip) ? 3 : 0; 3468 int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3469 u16 val;
3557 int ret; 3470 int ret;
3558 3471
3559 if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT)) 3472 if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
@@ -3561,11 +3474,13 @@ static int mv88e6xxx_get_temp_alarm(struct dsa_switch *ds, bool *alarm)
3561 3474
3562 *alarm = false; 3475 *alarm = false;
3563 3476
3564 ret = mv88e6xxx_mdio_page_read(ds, phy, 6, 26); 3477 mutex_lock(&chip->reg_lock);
3478 ret = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
3479 mutex_unlock(&chip->reg_lock);
3565 if (ret < 0) 3480 if (ret < 0)
3566 return ret; 3481 return ret;
3567 3482
3568 *alarm = !!(ret & 0x40); 3483 *alarm = !!(val & 0x40);
3569 3484
3570 return 0; 3485 return 0;
3571} 3486}