Commit c1602a1a authored by Jaedon Shin's avatar Jaedon Shin Committed by Kishon Vijay Abraham I

phy: phy_brcmstb_sata: add support for MIPS-based platforms

The BCM7xxx ARM-based and MIPS-based platforms share a similar hardware
block for AHCI SATA3.

This new compatible string, "brcm,bcm7425-sata-phy", may be used for
most MIPS-based platforms of 40nm process technology.
Signed-off-by: default avatarJaedon Shin <jaedon.shin@gmail.com>
Acked-by: default avatarRob Herring <robh@kernel.org>
Tested-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Acked-by: default avatarBrian Norris <computersforpeace@gmail.com>
Signed-off-by: default avatarKishon Vijay Abraham I <kishon@ti.com>
parent 810c6f16
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
Required properties: Required properties:
- compatible: should be one or more of - compatible: should be one or more of
"brcm,bcm7425-sata-phy"
"brcm,bcm7445-sata-phy" "brcm,bcm7445-sata-phy"
"brcm,phy-sata3" "brcm,phy-sata3"
- address-cells: should be 1 - address-cells: should be 1
......
...@@ -390,11 +390,11 @@ config PHY_TUSB1210 ...@@ -390,11 +390,11 @@ config PHY_TUSB1210
config PHY_BRCMSTB_SATA config PHY_BRCMSTB_SATA
tristate "Broadcom STB SATA PHY driver" tristate "Broadcom STB SATA PHY driver"
depends on ARCH_BRCMSTB depends on ARCH_BRCMSTB || BMIPS_GENERIC
depends on OF depends on OF
select GENERIC_PHY select GENERIC_PHY
help help
Enable this to support the SATA3 PHY on 28nm Broadcom STB SoCs. Enable this to support the SATA3 PHY on 28nm or 40nm Broadcom STB SoCs.
Likely useful only with CONFIG_SATA_BRCMSTB enabled. Likely useful only with CONFIG_SATA_BRCMSTB enabled.
config PHY_CYGNUS_PCIE config PHY_CYGNUS_PCIE
......
...@@ -32,8 +32,14 @@ ...@@ -32,8 +32,14 @@
/* Register offset between PHYs in PCB space */ /* Register offset between PHYs in PCB space */
#define SATA_MDIO_REG_28NM_SPACE_SIZE 0x1000 #define SATA_MDIO_REG_28NM_SPACE_SIZE 0x1000
/* The older SATA PHY registers duplicated per port registers within the map,
* rather than having a separate map per port.
*/
#define SATA_MDIO_REG_40NM_SPACE_SIZE 0x10
enum brcm_sata_phy_version { enum brcm_sata_phy_version {
BRCM_SATA_PHY_28NM, BRCM_SATA_PHY_28NM,
BRCM_SATA_PHY_40NM,
}; };
struct brcm_sata_port { struct brcm_sata_port {
...@@ -51,7 +57,7 @@ struct brcm_sata_phy { ...@@ -51,7 +57,7 @@ struct brcm_sata_phy {
struct brcm_sata_port phys[MAX_PORTS]; struct brcm_sata_port phys[MAX_PORTS];
}; };
enum sata_mdio_phy_regs_28nm { enum sata_mdio_phy_regs {
PLL_REG_BANK_0 = 0x50, PLL_REG_BANK_0 = 0x50,
PLL_REG_BANK_0_PLLCONTROL_0 = 0x81, PLL_REG_BANK_0_PLLCONTROL_0 = 0x81,
...@@ -69,10 +75,14 @@ enum sata_mdio_phy_regs_28nm { ...@@ -69,10 +75,14 @@ enum sata_mdio_phy_regs_28nm {
static inline void __iomem *brcm_sata_phy_base(struct brcm_sata_port *port) static inline void __iomem *brcm_sata_phy_base(struct brcm_sata_port *port)
{ {
struct brcm_sata_phy *priv = port->phy_priv; struct brcm_sata_phy *priv = port->phy_priv;
u32 offset; u32 offset = 0;
if (priv->version == BRCM_SATA_PHY_28NM) if (priv->version == BRCM_SATA_PHY_28NM)
offset = SATA_MDIO_REG_28NM_SPACE_SIZE; offset = SATA_MDIO_REG_28NM_SPACE_SIZE;
else if (priv->version == BRCM_SATA_PHY_40NM)
offset = SATA_MDIO_REG_40NM_SPACE_SIZE;
else
dev_err(priv->dev, "invalid phy version\n");
return priv->phy_base + (port->portnum * offset); return priv->phy_base + (port->portnum * offset);
} }
...@@ -93,7 +103,7 @@ static void brcm_sata_mdio_wr(void __iomem *addr, u32 bank, u32 ofs, ...@@ -93,7 +103,7 @@ static void brcm_sata_mdio_wr(void __iomem *addr, u32 bank, u32 ofs,
#define FMAX_VAL_DEFAULT 0x3df #define FMAX_VAL_DEFAULT 0x3df
#define FMAX_VAL_SSC 0x83 #define FMAX_VAL_SSC 0x83
static void brcm_sata_cfg_ssc_28nm(struct brcm_sata_port *port) static void brcm_sata_cfg_ssc(struct brcm_sata_port *port)
{ {
void __iomem *base = brcm_sata_phy_base(port); void __iomem *base = brcm_sata_phy_base(port);
struct brcm_sata_phy *priv = port->phy_priv; struct brcm_sata_phy *priv = port->phy_priv;
...@@ -124,12 +134,12 @@ static int brcm_sata_phy_init(struct phy *phy) ...@@ -124,12 +134,12 @@ static int brcm_sata_phy_init(struct phy *phy)
{ {
struct brcm_sata_port *port = phy_get_drvdata(phy); struct brcm_sata_port *port = phy_get_drvdata(phy);
brcm_sata_cfg_ssc_28nm(port); brcm_sata_cfg_ssc(port);
return 0; return 0;
} }
static const struct phy_ops phy_ops_28nm = { static const struct phy_ops phy_ops = {
.init = brcm_sata_phy_init, .init = brcm_sata_phy_init,
.owner = THIS_MODULE, .owner = THIS_MODULE,
}; };
...@@ -137,6 +147,8 @@ static const struct phy_ops phy_ops_28nm = { ...@@ -137,6 +147,8 @@ static const struct phy_ops phy_ops_28nm = {
static const struct of_device_id brcm_sata_phy_of_match[] = { static const struct of_device_id brcm_sata_phy_of_match[] = {
{ .compatible = "brcm,bcm7445-sata-phy", { .compatible = "brcm,bcm7445-sata-phy",
.data = (void *)BRCM_SATA_PHY_28NM }, .data = (void *)BRCM_SATA_PHY_28NM },
{ .compatible = "brcm,bcm7425-sata-phy",
.data = (void *)BRCM_SATA_PHY_40NM },
{}, {},
}; };
MODULE_DEVICE_TABLE(of, brcm_sata_phy_of_match); MODULE_DEVICE_TABLE(of, brcm_sata_phy_of_match);
...@@ -196,7 +208,7 @@ static int brcm_sata_phy_probe(struct platform_device *pdev) ...@@ -196,7 +208,7 @@ static int brcm_sata_phy_probe(struct platform_device *pdev)
port = &priv->phys[id]; port = &priv->phys[id];
port->portnum = id; port->portnum = id;
port->phy_priv = priv; port->phy_priv = priv;
port->phy = devm_phy_create(dev, child, &phy_ops_28nm); port->phy = devm_phy_create(dev, child, &phy_ops);
port->ssc_en = of_property_read_bool(child, "brcm,enable-ssc"); port->ssc_en = of_property_read_bool(child, "brcm,enable-ssc");
if (IS_ERR(port->phy)) { if (IS_ERR(port->phy)) {
dev_err(dev, "failed to create PHY\n"); dev_err(dev, "failed to create PHY\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment