diff options
author | Vivien Didelot <vivien.didelot@savoirfairelinux.com> | 2016-08-15 17:19:02 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-08-15 19:43:56 -0400 |
commit | 9c93829c014f1a18a4aac2bf15b79ff4325a0912 (patch) | |
tree | 763c6a44a85c3b884d30adafac13a2f69ee6427f /drivers/net/dsa | |
parent | 09cb7dfd3f144d18168e27b35361e9024763db15 (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.c | 185 |
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 | ||
375 | static 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 | |||
383 | static 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 | |||
391 | static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip) | 375 | static 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 | ||
945 | static int mv88e6xxx_g2_smi_phy_read(struct mv88e6xxx_chip *chip, int addr, | ||
946 | int reg, u16 *val); | ||
947 | static int mv88e6xxx_g2_smi_phy_write(struct mv88e6xxx_chip *chip, int addr, | ||
948 | int reg, u16 val); | ||
949 | |||
950 | static 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 | |||
963 | static 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 | |||
969 | static int mv88e6xxx_get_eee(struct dsa_switch *ds, int port, | 929 | static 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, ®); |
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, ®); |
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 | |||
994 | out: | 953 | out: |
995 | mutex_unlock(&chip->reg_lock); | 954 | mutex_unlock(&chip->reg_lock); |
996 | return reg; | 955 | |
956 | return err; | ||
997 | } | 957 | } |
998 | 958 | ||
999 | static int mv88e6xxx_set_eee(struct dsa_switch *ds, int port, | 959 | static 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, ®); |
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); |
1022 | out: | 982 | out: |
1023 | mutex_unlock(&chip->reg_lock); | 983 | mutex_unlock(&chip->reg_lock); |
1024 | 984 | ||
1025 | return ret; | 985 | return err; |
1026 | } | 986 | } |
1027 | 987 | ||
1028 | static int _mv88e6xxx_atu_cmd(struct mv88e6xxx_chip *chip, u16 fid, u16 cmd) | 988 | static 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 | ||
2385 | static 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); | ||
2395 | restore_page_0: | ||
2396 | mv88e6xxx_mdio_write_indirect(chip, port, 0x16, 0x0); | ||
2397 | |||
2398 | return ret; | ||
2399 | } | ||
2400 | |||
2401 | static 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); | ||
2411 | restore_page_0: | ||
2412 | mv88e6xxx_mdio_write_indirect(chip, port, 0x16, 0x0); | ||
2413 | |||
2414 | return ret; | ||
2415 | } | ||
2416 | |||
2417 | static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip) | 2345 | static 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 | ||
3325 | static 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 | |||
3338 | static 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 | |||
3351 | static int mv88e6xxx_mdio_read(struct mii_bus *bus, int phy, int reg) | 3253 | static 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) | |||
3441 | static int mv88e61xx_get_temp(struct dsa_switch *ds, int *temp) | 3343 | static 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 | ||
3480 | error: | 3380 | error: |
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)); |
3459 | unlock: | ||
3460 | mutex_unlock(&chip->reg_lock); | ||
3461 | |||
3462 | return err; | ||
3551 | } | 3463 | } |
3552 | 3464 | ||
3553 | static int mv88e6xxx_get_temp_alarm(struct dsa_switch *ds, bool *alarm) | 3465 | static 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 | } |