aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/phy
diff options
context:
space:
mode:
authorYendapally Reddy Dhananjaya Reddy <yendapally.reddy@broadcom.com>2016-06-16 09:53:34 -0400
committerTejun Heo <tj@kernel.org>2016-06-16 16:24:55 -0400
commit024812889ad1c2d6c718feb4acdc2a7828b82e64 (patch)
treecb9ec3fbe5d48499f530a10c574596dba631d2a2 /drivers/phy
parent3ee2e6dcaa3570df6f7ceeda6d8342bc47cf6b1c (diff)
phy: Add SATA3 PHY support for Broadcom NSP SoC
This patch adds support for Broadcom NSP SATA3 PHY in existing Broadcom SATA PHY driver. Signed-off-by: Yendapally Reddy Dhananjaya Reddy <yendapally.reddy@broadcom.com> Acked-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'drivers/phy')
-rw-r--r--drivers/phy/phy-brcm-sata.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/drivers/phy/phy-brcm-sata.c b/drivers/phy/phy-brcm-sata.c
index 6c4c5cb791ca..18d662610075 100644
--- a/drivers/phy/phy-brcm-sata.c
+++ b/drivers/phy/phy-brcm-sata.c
@@ -45,6 +45,7 @@ enum brcm_sata_phy_version {
45 BRCM_SATA_PHY_STB_28NM, 45 BRCM_SATA_PHY_STB_28NM,
46 BRCM_SATA_PHY_STB_40NM, 46 BRCM_SATA_PHY_STB_40NM,
47 BRCM_SATA_PHY_IPROC_NS2, 47 BRCM_SATA_PHY_IPROC_NS2,
48 BRCM_SATA_PHY_IPROC_NSP,
48}; 49};
49 50
50struct brcm_sata_port { 51struct brcm_sata_port {
@@ -73,6 +74,13 @@ enum sata_phy_regs {
73 74
74 PLL_REG_BANK_0 = 0x050, 75 PLL_REG_BANK_0 = 0x050,
75 PLL_REG_BANK_0_PLLCONTROL_0 = 0x81, 76 PLL_REG_BANK_0_PLLCONTROL_0 = 0x81,
77 PLLCONTROL_0_FREQ_DET_RESTART = BIT(13),
78 PLLCONTROL_0_FREQ_MONITOR = BIT(12),
79 PLLCONTROL_0_SEQ_START = BIT(15),
80 PLL_CAP_CONTROL = 0x85,
81 PLL_ACTRL2 = 0x8b,
82 PLL_ACTRL2_SELDIV_MASK = 0x1f,
83 PLL_ACTRL2_SELDIV_SHIFT = 9,
76 84
77 PLL1_REG_BANK = 0x060, 85 PLL1_REG_BANK = 0x060,
78 PLL1_ACTRL2 = 0x82, 86 PLL1_ACTRL2 = 0x82,
@@ -80,6 +88,7 @@ enum sata_phy_regs {
80 PLL1_ACTRL4 = 0x84, 88 PLL1_ACTRL4 = 0x84,
81 89
82 OOB_REG_BANK = 0x150, 90 OOB_REG_BANK = 0x150,
91 OOB1_REG_BANK = 0x160,
83 OOB_CTRL1 = 0x80, 92 OOB_CTRL1 = 0x80,
84 OOB_CTRL1_BURST_MAX_MASK = 0xf, 93 OOB_CTRL1_BURST_MAX_MASK = 0xf,
85 OOB_CTRL1_BURST_MAX_SHIFT = 12, 94 OOB_CTRL1_BURST_MAX_SHIFT = 12,
@@ -271,6 +280,73 @@ static int brcm_ns2_sata_init(struct brcm_sata_port *port)
271 return 0; 280 return 0;
272} 281}
273 282
283static int brcm_nsp_sata_init(struct brcm_sata_port *port)
284{
285 struct brcm_sata_phy *priv = port->phy_priv;
286 struct device *dev = port->phy_priv->dev;
287 void __iomem *base = priv->phy_base;
288 unsigned int oob_bank;
289 unsigned int val, try;
290
291 /* Configure OOB control */
292 if (port->portnum == 0)
293 oob_bank = OOB_REG_BANK;
294 else if (port->portnum == 1)
295 oob_bank = OOB1_REG_BANK;
296 else
297 return -EINVAL;
298
299 val = 0x0;
300 val |= (0x0f << OOB_CTRL1_BURST_MAX_SHIFT);
301 val |= (0x06 << OOB_CTRL1_BURST_MIN_SHIFT);
302 val |= (0x0f << OOB_CTRL1_WAKE_IDLE_MAX_SHIFT);
303 val |= (0x06 << OOB_CTRL1_WAKE_IDLE_MIN_SHIFT);
304 brcm_sata_phy_wr(base, oob_bank, OOB_CTRL1, 0x0, val);
305
306 val = 0x0;
307 val |= (0x2e << OOB_CTRL2_RESET_IDLE_MAX_SHIFT);
308 val |= (0x02 << OOB_CTRL2_BURST_CNT_SHIFT);
309 val |= (0x16 << OOB_CTRL2_RESET_IDLE_MIN_SHIFT);
310 brcm_sata_phy_wr(base, oob_bank, OOB_CTRL2, 0x0, val);
311
312
313 brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_ACTRL2,
314 ~(PLL_ACTRL2_SELDIV_MASK << PLL_ACTRL2_SELDIV_SHIFT),
315 0x0c << PLL_ACTRL2_SELDIV_SHIFT);
316
317 brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_CAP_CONTROL,
318 0xff0, 0x4f0);
319
320 val = PLLCONTROL_0_FREQ_DET_RESTART | PLLCONTROL_0_FREQ_MONITOR;
321 brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
322 ~val, val);
323 val = PLLCONTROL_0_SEQ_START;
324 brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
325 ~val, 0);
326 mdelay(10);
327 brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
328 ~val, val);
329
330 /* Wait for pll_seq_done bit */
331 try = 50;
332 while (try--) {
333 val = brcm_sata_phy_rd(base, BLOCK0_REG_BANK,
334 BLOCK0_XGXSSTATUS);
335 if (val & BLOCK0_XGXSSTATUS_PLL_LOCK)
336 break;
337 msleep(20);
338 }
339 if (!try) {
340 /* PLL did not lock; give up */
341 dev_err(dev, "port%d PLL did not lock\n", port->portnum);
342 return -ETIMEDOUT;
343 }
344
345 dev_dbg(dev, "port%d initialized\n", port->portnum);
346
347 return 0;
348}
349
274static int brcm_sata_phy_init(struct phy *phy) 350static int brcm_sata_phy_init(struct phy *phy)
275{ 351{
276 int rc; 352 int rc;
@@ -284,6 +360,9 @@ static int brcm_sata_phy_init(struct phy *phy)
284 case BRCM_SATA_PHY_IPROC_NS2: 360 case BRCM_SATA_PHY_IPROC_NS2:
285 rc = brcm_ns2_sata_init(port); 361 rc = brcm_ns2_sata_init(port);
286 break; 362 break;
363 case BRCM_SATA_PHY_IPROC_NSP:
364 rc = brcm_nsp_sata_init(port);
365 break;
287 default: 366 default:
288 rc = -ENODEV; 367 rc = -ENODEV;
289 }; 368 };
@@ -303,6 +382,8 @@ static const struct of_device_id brcm_sata_phy_of_match[] = {
303 .data = (void *)BRCM_SATA_PHY_STB_40NM }, 382 .data = (void *)BRCM_SATA_PHY_STB_40NM },
304 { .compatible = "brcm,iproc-ns2-sata-phy", 383 { .compatible = "brcm,iproc-ns2-sata-phy",
305 .data = (void *)BRCM_SATA_PHY_IPROC_NS2 }, 384 .data = (void *)BRCM_SATA_PHY_IPROC_NS2 },
385 { .compatible = "brcm,iproc-nsp-sata-phy",
386 .data = (void *)BRCM_SATA_PHY_IPROC_NSP },
306 {}, 387 {},
307}; 388};
308MODULE_DEVICE_TABLE(of, brcm_sata_phy_of_match); 389MODULE_DEVICE_TABLE(of, brcm_sata_phy_of_match);