diff options
author | Florian Fainelli <f.fainelli@gmail.com> | 2014-09-19 16:07:55 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-09-19 16:27:07 -0400 |
commit | aa9aef77c76113725d9dbf124c4dab414326b0a3 (patch) | |
tree | 1a3a54f7bbf096cd44fbfb8afcc9f6f9605309c9 | |
parent | 6819563e646a7f3692836daefd12cd86c697759f (diff) |
net: dsa: bcm_sf2: communicate integrated PHY revision to PHY driver
The integrated BCM7xxx PHY contains no useful revision information
in its MII_PHYSID2 bits 3:0, that information is instead contained in
the SWITCH_REG_PHY_REVISION register.
Read this register, store its value, and return it by implementing the
dsa_switch::get_phy_flags() callback accordingly. The register layout is
already matching what the BCM7xxx PHY driver is expecting to find.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/dsa/bcm_sf2.c | 16 | ||||
-rw-r--r-- | drivers/net/dsa/bcm_sf2.h | 1 | ||||
-rw-r--r-- | drivers/net/dsa/bcm_sf2_regs.h | 1 |
3 files changed, 18 insertions, 0 deletions
diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c index 02d7db320d90..a97ba2548ea5 100644 --- a/drivers/net/dsa/bcm_sf2.c +++ b/drivers/net/dsa/bcm_sf2.c | |||
@@ -376,6 +376,9 @@ static int bcm_sf2_sw_setup(struct dsa_switch *ds) | |||
376 | SWITCH_TOP_REV_MASK; | 376 | SWITCH_TOP_REV_MASK; |
377 | priv->hw_params.core_rev = (rev & SF2_REV_MASK); | 377 | priv->hw_params.core_rev = (rev & SF2_REV_MASK); |
378 | 378 | ||
379 | rev = reg_readl(priv, REG_PHY_REVISION); | ||
380 | priv->hw_params.gphy_rev = rev & PHY_REVISION_MASK; | ||
381 | |||
379 | pr_info("Starfighter 2 top: %x.%02x, core: %x.%02x base: 0x%p, IRQs: %d, %d\n", | 382 | pr_info("Starfighter 2 top: %x.%02x, core: %x.%02x base: 0x%p, IRQs: %d, %d\n", |
380 | priv->hw_params.top_rev >> 8, priv->hw_params.top_rev & 0xff, | 383 | priv->hw_params.top_rev >> 8, priv->hw_params.top_rev & 0xff, |
381 | priv->hw_params.core_rev >> 8, priv->hw_params.core_rev & 0xff, | 384 | priv->hw_params.core_rev >> 8, priv->hw_params.core_rev & 0xff, |
@@ -399,6 +402,18 @@ static int bcm_sf2_sw_set_addr(struct dsa_switch *ds, u8 *addr) | |||
399 | return 0; | 402 | return 0; |
400 | } | 403 | } |
401 | 404 | ||
405 | static u32 bcm_sf2_sw_get_phy_flags(struct dsa_switch *ds, int port) | ||
406 | { | ||
407 | struct bcm_sf2_priv *priv = ds_to_priv(ds); | ||
408 | |||
409 | /* The BCM7xxx PHY driver expects to find the integrated PHY revision | ||
410 | * in bits 15:8 and the patch level in bits 7:0 which is exactly what | ||
411 | * the REG_PHY_REVISION register layout is. | ||
412 | */ | ||
413 | |||
414 | return priv->hw_params.gphy_rev; | ||
415 | } | ||
416 | |||
402 | static int bcm_sf2_sw_indir_rw(struct dsa_switch *ds, int op, int addr, | 417 | static int bcm_sf2_sw_indir_rw(struct dsa_switch *ds, int op, int addr, |
403 | int regnum, u16 val) | 418 | int regnum, u16 val) |
404 | { | 419 | { |
@@ -597,6 +612,7 @@ static struct dsa_switch_driver bcm_sf2_switch_driver = { | |||
597 | .probe = bcm_sf2_sw_probe, | 612 | .probe = bcm_sf2_sw_probe, |
598 | .setup = bcm_sf2_sw_setup, | 613 | .setup = bcm_sf2_sw_setup, |
599 | .set_addr = bcm_sf2_sw_set_addr, | 614 | .set_addr = bcm_sf2_sw_set_addr, |
615 | .get_phy_flags = bcm_sf2_sw_get_phy_flags, | ||
600 | .phy_read = bcm_sf2_sw_phy_read, | 616 | .phy_read = bcm_sf2_sw_phy_read, |
601 | .phy_write = bcm_sf2_sw_phy_write, | 617 | .phy_write = bcm_sf2_sw_phy_write, |
602 | .get_strings = bcm_sf2_sw_get_strings, | 618 | .get_strings = bcm_sf2_sw_get_strings, |
diff --git a/drivers/net/dsa/bcm_sf2.h b/drivers/net/dsa/bcm_sf2.h index 260bab313e58..d3bd52dc40d2 100644 --- a/drivers/net/dsa/bcm_sf2.h +++ b/drivers/net/dsa/bcm_sf2.h | |||
@@ -26,6 +26,7 @@ | |||
26 | struct bcm_sf2_hw_params { | 26 | struct bcm_sf2_hw_params { |
27 | u16 top_rev; | 27 | u16 top_rev; |
28 | u16 core_rev; | 28 | u16 core_rev; |
29 | u16 gphy_rev; | ||
29 | u32 num_gphy; | 30 | u32 num_gphy; |
30 | u8 num_acb_queue; | 31 | u8 num_acb_queue; |
31 | u8 num_rgmii; | 32 | u8 num_rgmii; |
diff --git a/drivers/net/dsa/bcm_sf2_regs.h b/drivers/net/dsa/bcm_sf2_regs.h index 885c231b03b5..c65f138c777f 100644 --- a/drivers/net/dsa/bcm_sf2_regs.h +++ b/drivers/net/dsa/bcm_sf2_regs.h | |||
@@ -25,6 +25,7 @@ | |||
25 | #define SWITCH_TOP_REV_MASK 0xffff | 25 | #define SWITCH_TOP_REV_MASK 0xffff |
26 | 26 | ||
27 | #define REG_PHY_REVISION 0x1C | 27 | #define REG_PHY_REVISION 0x1C |
28 | #define PHY_REVISION_MASK 0xffff | ||
28 | 29 | ||
29 | #define REG_SPHY_CNTRL 0x2C | 30 | #define REG_SPHY_CNTRL 0x2C |
30 | #define IDDQ_BIAS (1 << 0) | 31 | #define IDDQ_BIAS (1 << 0) |