Linux Audio

Check our new training course

Loading...
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2/*
  3 * Broadcom SATA3 AHCI Controller PHY Driver
  4 *
  5 * Copyright (C) 2016 Broadcom
  6 */
  7
  8#include <linux/delay.h>
  9#include <linux/device.h>
 10#include <linux/init.h>
 11#include <linux/interrupt.h>
 12#include <linux/io.h>
 13#include <linux/kernel.h>
 14#include <linux/module.h>
 15#include <linux/of.h>
 16#include <linux/phy/phy.h>
 17#include <linux/platform_device.h>
 18
 19#define SATA_PCB_BANK_OFFSET				0x23c
 20#define SATA_PCB_REG_OFFSET(ofs)			((ofs) * 4)
 21
 22#define MAX_PORTS					2
 23
 24/* Register offset between PHYs in PCB space */
 25#define SATA_PCB_REG_28NM_SPACE_SIZE			0x1000
 26
 27/* The older SATA PHY registers duplicated per port registers within the map,
 28 * rather than having a separate map per port.
 29 */
 30#define SATA_PCB_REG_40NM_SPACE_SIZE			0x10
 31
 32/* Register offset between PHYs in PHY control space */
 33#define SATA_PHY_CTRL_REG_28NM_SPACE_SIZE		0x8
 34
 35enum brcm_sata_phy_version {
 36	BRCM_SATA_PHY_STB_16NM,
 37	BRCM_SATA_PHY_STB_28NM,
 38	BRCM_SATA_PHY_STB_40NM,
 39	BRCM_SATA_PHY_IPROC_NS2,
 40	BRCM_SATA_PHY_IPROC_NSP,
 41	BRCM_SATA_PHY_IPROC_SR,
 42	BRCM_SATA_PHY_DSL_28NM,
 43};
 44
 45enum brcm_sata_phy_rxaeq_mode {
 46	RXAEQ_MODE_OFF = 0,
 47	RXAEQ_MODE_AUTO,
 48	RXAEQ_MODE_MANUAL,
 49};
 50
 51static enum brcm_sata_phy_rxaeq_mode rxaeq_to_val(const char *m)
 52{
 53	if (!strcmp(m, "auto"))
 54		return RXAEQ_MODE_AUTO;
 55	else if (!strcmp(m, "manual"))
 56		return RXAEQ_MODE_MANUAL;
 57	else
 58		return RXAEQ_MODE_OFF;
 59}
 60
 61struct brcm_sata_port {
 62	int portnum;
 63	struct phy *phy;
 64	struct brcm_sata_phy *phy_priv;
 65	bool ssc_en;
 66	enum brcm_sata_phy_rxaeq_mode rxaeq_mode;
 67	u32 rxaeq_val;
 68	u32 tx_amplitude_val;
 69};
 70
 71struct brcm_sata_phy {
 72	struct device *dev;
 73	void __iomem *phy_base;
 74	void __iomem *ctrl_base;
 75	enum brcm_sata_phy_version version;
 76
 77	struct brcm_sata_port phys[MAX_PORTS];
 78};
 79
 80enum sata_phy_regs {
 81	BLOCK0_REG_BANK				= 0x000,
 82	BLOCK0_XGXSSTATUS			= 0x81,
 83	BLOCK0_XGXSSTATUS_PLL_LOCK		= BIT(12),
 84	BLOCK0_SPARE				= 0x8d,
 85	BLOCK0_SPARE_OOB_CLK_SEL_MASK		= 0x3,
 86	BLOCK0_SPARE_OOB_CLK_SEL_REFBY2		= 0x1,
 87
 88	BLOCK1_REG_BANK				= 0x10,
 89	BLOCK1_TEST_TX				= 0x83,
 90	BLOCK1_TEST_TX_AMP_SHIFT		= 12,
 91
 92	PLL_REG_BANK_0				= 0x050,
 93	PLL_REG_BANK_0_PLLCONTROL_0		= 0x81,
 94	PLLCONTROL_0_FREQ_DET_RESTART		= BIT(13),
 95	PLLCONTROL_0_FREQ_MONITOR		= BIT(12),
 96	PLLCONTROL_0_SEQ_START			= BIT(15),
 97	PLL_CAP_CHARGE_TIME			= 0x83,
 98	PLL_VCO_CAL_THRESH			= 0x84,
 99	PLL_CAP_CONTROL				= 0x85,
100	PLL_FREQ_DET_TIME			= 0x86,
101	PLL_ACTRL2				= 0x8b,
102	PLL_ACTRL2_SELDIV_MASK			= 0x1f,
103	PLL_ACTRL2_SELDIV_SHIFT			= 9,
104	PLL_ACTRL6				= 0x86,
105
106	PLL1_REG_BANK				= 0x060,
107	PLL1_ACTRL2				= 0x82,
108	PLL1_ACTRL3				= 0x83,
109	PLL1_ACTRL4				= 0x84,
110	PLL1_ACTRL5				= 0x85,
111	PLL1_ACTRL6				= 0x86,
112	PLL1_ACTRL7				= 0x87,
113	PLL1_ACTRL8				= 0x88,
114
115	TX_REG_BANK				= 0x070,
116	TX_ACTRL0				= 0x80,
117	TX_ACTRL0_TXPOL_FLIP			= BIT(6),
118	TX_ACTRL5				= 0x85,
119	TX_ACTRL5_SSC_EN			= BIT(11),
120
121	AEQRX_REG_BANK_0			= 0xd0,
122	AEQ_CONTROL1				= 0x81,
123	AEQ_CONTROL1_ENABLE			= BIT(2),
124	AEQ_CONTROL1_FREEZE			= BIT(3),
125	AEQ_FRC_EQ				= 0x83,
126	AEQ_FRC_EQ_FORCE			= BIT(0),
127	AEQ_FRC_EQ_FORCE_VAL			= BIT(1),
128	AEQ_RFZ_FRC_VAL				= BIT(8),
129	AEQRX_REG_BANK_1			= 0xe0,
130	AEQRX_SLCAL0_CTRL0			= 0x82,
131	AEQRX_SLCAL1_CTRL0			= 0x86,
132
133	OOB_REG_BANK				= 0x150,
134	OOB1_REG_BANK				= 0x160,
135	OOB_CTRL1				= 0x80,
136	OOB_CTRL1_BURST_MAX_MASK		= 0xf,
137	OOB_CTRL1_BURST_MAX_SHIFT		= 12,
138	OOB_CTRL1_BURST_MIN_MASK		= 0xf,
139	OOB_CTRL1_BURST_MIN_SHIFT		= 8,
140	OOB_CTRL1_WAKE_IDLE_MAX_MASK		= 0xf,
141	OOB_CTRL1_WAKE_IDLE_MAX_SHIFT		= 4,
142	OOB_CTRL1_WAKE_IDLE_MIN_MASK		= 0xf,
143	OOB_CTRL1_WAKE_IDLE_MIN_SHIFT		= 0,
144	OOB_CTRL2				= 0x81,
145	OOB_CTRL2_SEL_ENA_SHIFT			= 15,
146	OOB_CTRL2_SEL_ENA_RC_SHIFT		= 14,
147	OOB_CTRL2_RESET_IDLE_MAX_MASK		= 0x3f,
148	OOB_CTRL2_RESET_IDLE_MAX_SHIFT		= 8,
149	OOB_CTRL2_BURST_CNT_MASK		= 0x3,
150	OOB_CTRL2_BURST_CNT_SHIFT		= 6,
151	OOB_CTRL2_RESET_IDLE_MIN_MASK		= 0x3f,
152	OOB_CTRL2_RESET_IDLE_MIN_SHIFT		= 0,
153
154	TXPMD_REG_BANK				= 0x1a0,
155	TXPMD_CONTROL1				= 0x81,
156	TXPMD_CONTROL1_TX_SSC_EN_FRC		= BIT(0),
157	TXPMD_CONTROL1_TX_SSC_EN_FRC_VAL	= BIT(1),
158	TXPMD_TX_FREQ_CTRL_CONTROL1		= 0x82,
159	TXPMD_TX_FREQ_CTRL_CONTROL2		= 0x83,
160	TXPMD_TX_FREQ_CTRL_CONTROL2_FMIN_MASK	= 0x3ff,
161	TXPMD_TX_FREQ_CTRL_CONTROL3		= 0x84,
162	TXPMD_TX_FREQ_CTRL_CONTROL3_FMAX_MASK	= 0x3ff,
163
164	RXPMD_REG_BANK				= 0x1c0,
165	RXPMD_RX_CDR_CONTROL1			= 0x81,
166	RXPMD_RX_PPM_VAL_MASK			= 0x1ff,
167	RXPMD_RXPMD_EN_FRC			= BIT(12),
168	RXPMD_RXPMD_EN_FRC_VAL			= BIT(13),
169	RXPMD_RX_CDR_CDR_PROP_BW		= 0x82,
170	RXPMD_G_CDR_PROP_BW_MASK		= 0x7,
171	RXPMD_G1_CDR_PROP_BW_SHIFT		= 0,
172	RXPMD_G2_CDR_PROP_BW_SHIFT		= 3,
173	RXPMD_G3_CDR_PROB_BW_SHIFT		= 6,
174	RXPMD_RX_CDR_CDR_ACQ_INTEG_BW		= 0x83,
175	RXPMD_G_CDR_ACQ_INT_BW_MASK		= 0x7,
176	RXPMD_G1_CDR_ACQ_INT_BW_SHIFT		= 0,
177	RXPMD_G2_CDR_ACQ_INT_BW_SHIFT		= 3,
178	RXPMD_G3_CDR_ACQ_INT_BW_SHIFT		= 6,
179	RXPMD_RX_CDR_CDR_LOCK_INTEG_BW		= 0x84,
180	RXPMD_G_CDR_LOCK_INT_BW_MASK		= 0x7,
181	RXPMD_G1_CDR_LOCK_INT_BW_SHIFT		= 0,
182	RXPMD_G2_CDR_LOCK_INT_BW_SHIFT		= 3,
183	RXPMD_G3_CDR_LOCK_INT_BW_SHIFT		= 6,
184	RXPMD_RX_FREQ_MON_CONTROL1		= 0x87,
185	RXPMD_MON_CORRECT_EN			= BIT(8),
186	RXPMD_MON_MARGIN_VAL_MASK		= 0xff,
187};
188
189enum sata_phy_ctrl_regs {
190	PHY_CTRL_1				= 0x0,
191	PHY_CTRL_1_RESET			= BIT(0),
192};
193
194static inline void __iomem *brcm_sata_ctrl_base(struct brcm_sata_port *port)
195{
196	struct brcm_sata_phy *priv = port->phy_priv;
197	u32 size = 0;
198
199	switch (priv->version) {
200	case BRCM_SATA_PHY_IPROC_NS2:
201		size = SATA_PHY_CTRL_REG_28NM_SPACE_SIZE;
202		break;
203	default:
204		dev_err(priv->dev, "invalid phy version\n");
205		break;
206	}
207
208	return priv->ctrl_base + (port->portnum * size);
209}
210
211static void brcm_sata_phy_wr(struct brcm_sata_port *port, u32 bank,
212			     u32 ofs, u32 msk, u32 value)
213{
214	struct brcm_sata_phy *priv = port->phy_priv;
215	void __iomem *pcb_base = priv->phy_base;
216	u32 tmp;
217
218	if (priv->version == BRCM_SATA_PHY_STB_40NM)
219		bank += (port->portnum * SATA_PCB_REG_40NM_SPACE_SIZE);
220	else
221		pcb_base += (port->portnum * SATA_PCB_REG_28NM_SPACE_SIZE);
222
223	writel(bank, pcb_base + SATA_PCB_BANK_OFFSET);
224	tmp = readl(pcb_base + SATA_PCB_REG_OFFSET(ofs));
225	tmp = (tmp & msk) | value;
226	writel(tmp, pcb_base + SATA_PCB_REG_OFFSET(ofs));
227}
228
229static u32 brcm_sata_phy_rd(struct brcm_sata_port *port, u32 bank, u32 ofs)
230{
231	struct brcm_sata_phy *priv = port->phy_priv;
232	void __iomem *pcb_base = priv->phy_base;
233
234	if (priv->version == BRCM_SATA_PHY_STB_40NM)
235		bank += (port->portnum * SATA_PCB_REG_40NM_SPACE_SIZE);
236	else
237		pcb_base += (port->portnum * SATA_PCB_REG_28NM_SPACE_SIZE);
238
239	writel(bank, pcb_base + SATA_PCB_BANK_OFFSET);
240	return readl(pcb_base + SATA_PCB_REG_OFFSET(ofs));
241}
242
243/* These defaults were characterized by H/W group */
244#define STB_FMIN_VAL_DEFAULT	0x3df
245#define STB_FMAX_VAL_DEFAULT	0x3df
246#define STB_FMAX_VAL_SSC	0x83
247
248static void brcm_stb_sata_ssc_init(struct brcm_sata_port *port)
249{
250	struct brcm_sata_phy *priv = port->phy_priv;
251	u32 tmp;
252
253	/* override the TX spread spectrum setting */
254	tmp = TXPMD_CONTROL1_TX_SSC_EN_FRC_VAL | TXPMD_CONTROL1_TX_SSC_EN_FRC;
255	brcm_sata_phy_wr(port, TXPMD_REG_BANK, TXPMD_CONTROL1, ~tmp, tmp);
256
257	/* set fixed min freq */
258	brcm_sata_phy_wr(port, TXPMD_REG_BANK, TXPMD_TX_FREQ_CTRL_CONTROL2,
259			 ~TXPMD_TX_FREQ_CTRL_CONTROL2_FMIN_MASK,
260			 STB_FMIN_VAL_DEFAULT);
261
262	/* set fixed max freq depending on SSC config */
263	if (port->ssc_en) {
264		dev_info(priv->dev, "enabling SSC on port%d\n", port->portnum);
265		tmp = STB_FMAX_VAL_SSC;
266	} else {
267		tmp = STB_FMAX_VAL_DEFAULT;
268	}
269
270	brcm_sata_phy_wr(port, TXPMD_REG_BANK, TXPMD_TX_FREQ_CTRL_CONTROL3,
271			  ~TXPMD_TX_FREQ_CTRL_CONTROL3_FMAX_MASK, tmp);
272}
273
274#define AEQ_FRC_EQ_VAL_SHIFT	2
275#define AEQ_FRC_EQ_VAL_MASK	0x3f
276
277static int brcm_stb_sata_rxaeq_init(struct brcm_sata_port *port)
278{
279	u32 tmp = 0, reg = 0;
280
281	switch (port->rxaeq_mode) {
282	case RXAEQ_MODE_OFF:
283		return 0;
284
285	case RXAEQ_MODE_AUTO:
286		reg = AEQ_CONTROL1;
287		tmp = AEQ_CONTROL1_ENABLE | AEQ_CONTROL1_FREEZE;
288		break;
289
290	case RXAEQ_MODE_MANUAL:
291		reg = AEQ_FRC_EQ;
292		tmp = AEQ_FRC_EQ_FORCE | AEQ_FRC_EQ_FORCE_VAL;
293		if (port->rxaeq_val > AEQ_FRC_EQ_VAL_MASK)
294			return -EINVAL;
295		tmp |= port->rxaeq_val << AEQ_FRC_EQ_VAL_SHIFT;
296		break;
297	}
298
299	brcm_sata_phy_wr(port, AEQRX_REG_BANK_0, reg, ~tmp, tmp);
300	brcm_sata_phy_wr(port, AEQRX_REG_BANK_1, reg, ~tmp, tmp);
301
302	return 0;
303}
304
305static int brcm_stb_sata_init(struct brcm_sata_port *port)
306{
307	brcm_stb_sata_ssc_init(port);
308
309	return brcm_stb_sata_rxaeq_init(port);
310}
311
312static int brcm_stb_sata_16nm_ssc_init(struct brcm_sata_port *port)
313{
314	u32 tmp, value;
315
316	/* Reduce CP tail current to 1/16th of its default value */
317	brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL6, 0, 0x141);
318
319	/* Turn off CP tail current boost */
320	brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL8, 0, 0xc006);
321
322	/* Set a specific AEQ equalizer value */
323	tmp = AEQ_FRC_EQ_FORCE_VAL | AEQ_FRC_EQ_FORCE;
324	brcm_sata_phy_wr(port, AEQRX_REG_BANK_0, AEQ_FRC_EQ,
325			 ~(tmp | AEQ_RFZ_FRC_VAL |
326			   AEQ_FRC_EQ_VAL_MASK << AEQ_FRC_EQ_VAL_SHIFT),
327			 tmp | 32 << AEQ_FRC_EQ_VAL_SHIFT);
328
329	/* Set RX PPM val center frequency */
330	if (port->ssc_en)
331		value = 0x52;
332	else
333		value = 0;
334	brcm_sata_phy_wr(port, RXPMD_REG_BANK, RXPMD_RX_CDR_CONTROL1,
335			 ~RXPMD_RX_PPM_VAL_MASK, value);
336
337	/* Set proportional loop bandwith Gen1/2/3 */
338	tmp = RXPMD_G_CDR_PROP_BW_MASK << RXPMD_G1_CDR_PROP_BW_SHIFT |
339	      RXPMD_G_CDR_PROP_BW_MASK << RXPMD_G2_CDR_PROP_BW_SHIFT |
340	      RXPMD_G_CDR_PROP_BW_MASK << RXPMD_G3_CDR_PROB_BW_SHIFT;
341	if (port->ssc_en)
342		value = 2 << RXPMD_G1_CDR_PROP_BW_SHIFT |
343			2 << RXPMD_G2_CDR_PROP_BW_SHIFT |
344			2 << RXPMD_G3_CDR_PROB_BW_SHIFT;
345	else
346		value = 1 << RXPMD_G1_CDR_PROP_BW_SHIFT |
347			1 << RXPMD_G2_CDR_PROP_BW_SHIFT |
348			1 << RXPMD_G3_CDR_PROB_BW_SHIFT;
349	brcm_sata_phy_wr(port, RXPMD_REG_BANK, RXPMD_RX_CDR_CDR_PROP_BW, ~tmp,
350			 value);
351
352	/* Set CDR integral loop acquisition bandwidth for Gen1/2/3 */
353	tmp = RXPMD_G_CDR_ACQ_INT_BW_MASK << RXPMD_G1_CDR_ACQ_INT_BW_SHIFT |
354	      RXPMD_G_CDR_ACQ_INT_BW_MASK << RXPMD_G2_CDR_ACQ_INT_BW_SHIFT |
355	      RXPMD_G_CDR_ACQ_INT_BW_MASK << RXPMD_G3_CDR_ACQ_INT_BW_SHIFT;
356	if (port->ssc_en)
357		value = 1 << RXPMD_G1_CDR_ACQ_INT_BW_SHIFT |
358			1 << RXPMD_G2_CDR_ACQ_INT_BW_SHIFT |
359			1 << RXPMD_G3_CDR_ACQ_INT_BW_SHIFT;
360	else
361		value = 0;
362	brcm_sata_phy_wr(port, RXPMD_REG_BANK, RXPMD_RX_CDR_CDR_ACQ_INTEG_BW,
363			 ~tmp, value);
364
365	/* Set CDR integral loop locking bandwidth to 1 for Gen 1/2/3 */
366	tmp = RXPMD_G_CDR_LOCK_INT_BW_MASK << RXPMD_G1_CDR_LOCK_INT_BW_SHIFT |
367	      RXPMD_G_CDR_LOCK_INT_BW_MASK << RXPMD_G2_CDR_LOCK_INT_BW_SHIFT |
368	      RXPMD_G_CDR_LOCK_INT_BW_MASK << RXPMD_G3_CDR_LOCK_INT_BW_SHIFT;
369	if (port->ssc_en)
370		value = 1 << RXPMD_G1_CDR_LOCK_INT_BW_SHIFT |
371			1 << RXPMD_G2_CDR_LOCK_INT_BW_SHIFT |
372			1 << RXPMD_G3_CDR_LOCK_INT_BW_SHIFT;
373	else
374		value = 0;
375	brcm_sata_phy_wr(port, RXPMD_REG_BANK, RXPMD_RX_CDR_CDR_LOCK_INTEG_BW,
376			 ~tmp, value);
377
378	/* Set no guard band and clamp CDR */
379	tmp = RXPMD_MON_CORRECT_EN | RXPMD_MON_MARGIN_VAL_MASK;
380	if (port->ssc_en)
381		value = 0x51;
382	else
383		value = 0;
384	brcm_sata_phy_wr(port, RXPMD_REG_BANK, RXPMD_RX_FREQ_MON_CONTROL1,
385			 ~tmp, RXPMD_MON_CORRECT_EN | value);
386
387	tmp = GENMASK(15, 12);
388	switch (port->tx_amplitude_val) {
389	case 400:
390		value = BIT(12) | BIT(13);
391		break;
392	case 500:
393		value = BIT(13);
394		break;
395	case 600:
396		value = BIT(12);
397		break;
398	case 800:
399		value = 0;
400		break;
401	default:
402		value = tmp;
403		break;
404	}
405
406	if (value != tmp)
407		brcm_sata_phy_wr(port, BLOCK1_REG_BANK, BLOCK1_TEST_TX, ~tmp,
408				 value);
409
410	/* Turn on/off SSC */
411	brcm_sata_phy_wr(port, TX_REG_BANK, TX_ACTRL5, ~TX_ACTRL5_SSC_EN,
412			 port->ssc_en ? TX_ACTRL5_SSC_EN : 0);
413
414	return 0;
415}
416
417static int brcm_stb_sata_16nm_init(struct brcm_sata_port *port)
418{
419	return brcm_stb_sata_16nm_ssc_init(port);
420}
421
422/* NS2 SATA PLL1 defaults were characterized by H/W group */
423#define NS2_PLL1_ACTRL2_MAGIC	0x1df8
424#define NS2_PLL1_ACTRL3_MAGIC	0x2b00
425#define NS2_PLL1_ACTRL4_MAGIC	0x8824
426
427static int brcm_ns2_sata_init(struct brcm_sata_port *port)
428{
429	int try;
430	unsigned int val;
431	void __iomem *ctrl_base = brcm_sata_ctrl_base(port);
432	struct device *dev = port->phy_priv->dev;
433
434	/* Configure OOB control */
435	val = 0x0;
436	val |= (0xc << OOB_CTRL1_BURST_MAX_SHIFT);
437	val |= (0x4 << OOB_CTRL1_BURST_MIN_SHIFT);
438	val |= (0x9 << OOB_CTRL1_WAKE_IDLE_MAX_SHIFT);
439	val |= (0x3 << OOB_CTRL1_WAKE_IDLE_MIN_SHIFT);
440	brcm_sata_phy_wr(port, OOB_REG_BANK, OOB_CTRL1, 0x0, val);
441	val = 0x0;
442	val |= (0x1b << OOB_CTRL2_RESET_IDLE_MAX_SHIFT);
443	val |= (0x2 << OOB_CTRL2_BURST_CNT_SHIFT);
444	val |= (0x9 << OOB_CTRL2_RESET_IDLE_MIN_SHIFT);
445	brcm_sata_phy_wr(port, OOB_REG_BANK, OOB_CTRL2, 0x0, val);
446
447	/* Configure PHY PLL register bank 1 */
448	val = NS2_PLL1_ACTRL2_MAGIC;
449	brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL2, 0x0, val);
450	val = NS2_PLL1_ACTRL3_MAGIC;
451	brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL3, 0x0, val);
452	val = NS2_PLL1_ACTRL4_MAGIC;
453	brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL4, 0x0, val);
454
455	/* Configure PHY BLOCK0 register bank */
456	/* Set oob_clk_sel to refclk/2 */
457	brcm_sata_phy_wr(port, BLOCK0_REG_BANK, BLOCK0_SPARE,
458			 ~BLOCK0_SPARE_OOB_CLK_SEL_MASK,
459			 BLOCK0_SPARE_OOB_CLK_SEL_REFBY2);
460
461	/* Strobe PHY reset using PHY control register */
462	writel(PHY_CTRL_1_RESET, ctrl_base + PHY_CTRL_1);
463	mdelay(1);
464	writel(0x0, ctrl_base + PHY_CTRL_1);
465	mdelay(1);
466
467	/* Wait for PHY PLL lock by polling pll_lock bit */
468	try = 50;
469	while (try) {
470		val = brcm_sata_phy_rd(port, BLOCK0_REG_BANK,
471					BLOCK0_XGXSSTATUS);
472		if (val & BLOCK0_XGXSSTATUS_PLL_LOCK)
473			break;
474		msleep(20);
475		try--;
476	}
477	if (!try) {
478		/* PLL did not lock; give up */
479		dev_err(dev, "port%d PLL did not lock\n", port->portnum);
480		return -ETIMEDOUT;
481	}
482
483	dev_dbg(dev, "port%d initialized\n", port->portnum);
484
485	return 0;
486}
487
488static int brcm_nsp_sata_init(struct brcm_sata_port *port)
489{
490	struct device *dev = port->phy_priv->dev;
491	unsigned int oob_bank;
492	unsigned int val, try;
493
494	/* Configure OOB control */
495	if (port->portnum == 0)
496		oob_bank = OOB_REG_BANK;
497	else if (port->portnum == 1)
498		oob_bank = OOB1_REG_BANK;
499	else
500		return -EINVAL;
501
502	val = 0x0;
503	val |= (0x0f << OOB_CTRL1_BURST_MAX_SHIFT);
504	val |= (0x06 << OOB_CTRL1_BURST_MIN_SHIFT);
505	val |= (0x0f << OOB_CTRL1_WAKE_IDLE_MAX_SHIFT);
506	val |= (0x06 << OOB_CTRL1_WAKE_IDLE_MIN_SHIFT);
507	brcm_sata_phy_wr(port, oob_bank, OOB_CTRL1, 0x0, val);
508
509	val = 0x0;
510	val |= (0x2e << OOB_CTRL2_RESET_IDLE_MAX_SHIFT);
511	val |= (0x02 << OOB_CTRL2_BURST_CNT_SHIFT);
512	val |= (0x16 << OOB_CTRL2_RESET_IDLE_MIN_SHIFT);
513	brcm_sata_phy_wr(port, oob_bank, OOB_CTRL2, 0x0, val);
514
515
516	brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_ACTRL2,
517		~(PLL_ACTRL2_SELDIV_MASK << PLL_ACTRL2_SELDIV_SHIFT),
518		0x0c << PLL_ACTRL2_SELDIV_SHIFT);
519
520	brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_CAP_CONTROL,
521						0xff0, 0x4f0);
522
523	val = PLLCONTROL_0_FREQ_DET_RESTART | PLLCONTROL_0_FREQ_MONITOR;
524	brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
525								~val, val);
526	val = PLLCONTROL_0_SEQ_START;
527	brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
528								~val, 0);
529	mdelay(10);
530	brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
531								~val, val);
532
533	/* Wait for pll_seq_done bit */
534	try = 50;
535	while (--try) {
536		val = brcm_sata_phy_rd(port, BLOCK0_REG_BANK,
537					BLOCK0_XGXSSTATUS);
538		if (val & BLOCK0_XGXSSTATUS_PLL_LOCK)
539			break;
540		msleep(20);
541	}
542	if (!try) {
543		/* PLL did not lock; give up */
544		dev_err(dev, "port%d PLL did not lock\n", port->portnum);
545		return -ETIMEDOUT;
546	}
547
548	dev_dbg(dev, "port%d initialized\n", port->portnum);
549
550	return 0;
551}
552
553/* SR PHY PLL0 registers */
554#define SR_PLL0_ACTRL6_MAGIC			0xa
555
556/* SR PHY PLL1 registers */
557#define SR_PLL1_ACTRL2_MAGIC			0x32
558#define SR_PLL1_ACTRL3_MAGIC			0x2
559#define SR_PLL1_ACTRL4_MAGIC			0x3e8
560
561static int brcm_sr_sata_init(struct brcm_sata_port *port)
562{
563	struct device *dev = port->phy_priv->dev;
564	unsigned int val, try;
565
566	/* Configure PHY PLL register bank 1 */
567	val = SR_PLL1_ACTRL2_MAGIC;
568	brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL2, 0x0, val);
569	val = SR_PLL1_ACTRL3_MAGIC;
570	brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL3, 0x0, val);
571	val = SR_PLL1_ACTRL4_MAGIC;
572	brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL4, 0x0, val);
573
574	/* Configure PHY PLL register bank 0 */
575	val = SR_PLL0_ACTRL6_MAGIC;
576	brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_ACTRL6, 0x0, val);
577
578	/* Wait for PHY PLL lock by polling pll_lock bit */
579	try = 50;
580	do {
581		val = brcm_sata_phy_rd(port, BLOCK0_REG_BANK,
582					BLOCK0_XGXSSTATUS);
583		if (val & BLOCK0_XGXSSTATUS_PLL_LOCK)
584			break;
585		msleep(20);
586		try--;
587	} while (try);
588
589	if ((val & BLOCK0_XGXSSTATUS_PLL_LOCK) == 0) {
590		/* PLL did not lock; give up */
591		dev_err(dev, "port%d PLL did not lock\n", port->portnum);
592		return -ETIMEDOUT;
593	}
594
595	/* Invert Tx polarity */
596	brcm_sata_phy_wr(port, TX_REG_BANK, TX_ACTRL0,
597			 ~TX_ACTRL0_TXPOL_FLIP, TX_ACTRL0_TXPOL_FLIP);
598
599	/* Configure OOB control to handle 100MHz reference clock */
600	val = ((0xc << OOB_CTRL1_BURST_MAX_SHIFT) |
601		(0x4 << OOB_CTRL1_BURST_MIN_SHIFT) |
602		(0x8 << OOB_CTRL1_WAKE_IDLE_MAX_SHIFT) |
603		(0x3 << OOB_CTRL1_WAKE_IDLE_MIN_SHIFT));
604	brcm_sata_phy_wr(port, OOB_REG_BANK, OOB_CTRL1, 0x0, val);
605	val = ((0x1b << OOB_CTRL2_RESET_IDLE_MAX_SHIFT) |
606		(0x2 << OOB_CTRL2_BURST_CNT_SHIFT) |
607		(0x9 << OOB_CTRL2_RESET_IDLE_MIN_SHIFT));
608	brcm_sata_phy_wr(port, OOB_REG_BANK, OOB_CTRL2, 0x0, val);
609
610	return 0;
611}
612
613static int brcm_dsl_sata_init(struct brcm_sata_port *port)
614{
615	struct device *dev = port->phy_priv->dev;
616	unsigned int try;
617	u32 tmp;
618
619	brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL7, 0, 0x873);
620
621	brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL6, 0, 0xc000);
622
623	brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
624			 0, 0x3089);
625	usleep_range(1000, 2000);
626
627	brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
628			 0, 0x3088);
629	usleep_range(1000, 2000);
630
631	brcm_sata_phy_wr(port, AEQRX_REG_BANK_1, AEQRX_SLCAL0_CTRL0,
632			 0, 0x3000);
633
634	brcm_sata_phy_wr(port, AEQRX_REG_BANK_1, AEQRX_SLCAL1_CTRL0,
635			 0, 0x3000);
636	usleep_range(1000, 2000);
637
638	brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_CAP_CHARGE_TIME, 0, 0x32);
639
640	brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_VCO_CAL_THRESH, 0, 0xa);
641
642	brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_FREQ_DET_TIME, 0, 0x64);
643	usleep_range(1000, 2000);
644
645	/* Acquire PLL lock */
646	try = 50;
647	while (try) {
648		tmp = brcm_sata_phy_rd(port, BLOCK0_REG_BANK,
649				       BLOCK0_XGXSSTATUS);
650		if (tmp & BLOCK0_XGXSSTATUS_PLL_LOCK)
651			break;
652		msleep(20);
653		try--;
654	}
655
656	if (!try) {
657		/* PLL did not lock; give up */
658		dev_err(dev, "port%d PLL did not lock\n", port->portnum);
659		return -ETIMEDOUT;
660	}
661
662	dev_dbg(dev, "port%d initialized\n", port->portnum);
663
664	return 0;
665}
666
667static int brcm_sata_phy_init(struct phy *phy)
668{
669	int rc;
670	struct brcm_sata_port *port = phy_get_drvdata(phy);
671
672	switch (port->phy_priv->version) {
673	case BRCM_SATA_PHY_STB_16NM:
674		rc = brcm_stb_sata_16nm_init(port);
675		break;
676	case BRCM_SATA_PHY_STB_28NM:
677	case BRCM_SATA_PHY_STB_40NM:
678		rc = brcm_stb_sata_init(port);
679		break;
680	case BRCM_SATA_PHY_IPROC_NS2:
681		rc = brcm_ns2_sata_init(port);
682		break;
683	case BRCM_SATA_PHY_IPROC_NSP:
684		rc = brcm_nsp_sata_init(port);
685		break;
686	case BRCM_SATA_PHY_IPROC_SR:
687		rc = brcm_sr_sata_init(port);
688		break;
689	case BRCM_SATA_PHY_DSL_28NM:
690		rc = brcm_dsl_sata_init(port);
691		break;
692	default:
693		rc = -ENODEV;
694	}
695
696	return rc;
697}
698
699static void brcm_stb_sata_calibrate(struct brcm_sata_port *port)
700{
701	u32 tmp = BIT(8);
702
703	brcm_sata_phy_wr(port, RXPMD_REG_BANK, RXPMD_RX_FREQ_MON_CONTROL1,
704			 ~tmp, tmp);
705}
706
707static int brcm_sata_phy_calibrate(struct phy *phy)
708{
709	struct brcm_sata_port *port = phy_get_drvdata(phy);
710	int rc = -EOPNOTSUPP;
711
712	switch (port->phy_priv->version) {
713	case BRCM_SATA_PHY_STB_28NM:
714	case BRCM_SATA_PHY_STB_40NM:
715		brcm_stb_sata_calibrate(port);
716		rc = 0;
717		break;
718	default:
719		break;
720	}
721
722	return rc;
723}
724
725static const struct phy_ops phy_ops = {
726	.init		= brcm_sata_phy_init,
727	.calibrate	= brcm_sata_phy_calibrate,
728	.owner		= THIS_MODULE,
729};
730
731static const struct of_device_id brcm_sata_phy_of_match[] = {
732	{ .compatible	= "brcm,bcm7216-sata-phy",
733	  .data = (void *)BRCM_SATA_PHY_STB_16NM },
734	{ .compatible	= "brcm,bcm7445-sata-phy",
735	  .data = (void *)BRCM_SATA_PHY_STB_28NM },
736	{ .compatible	= "brcm,bcm7425-sata-phy",
737	  .data = (void *)BRCM_SATA_PHY_STB_40NM },
738	{ .compatible	= "brcm,iproc-ns2-sata-phy",
739	  .data = (void *)BRCM_SATA_PHY_IPROC_NS2 },
740	{ .compatible = "brcm,iproc-nsp-sata-phy",
741	  .data = (void *)BRCM_SATA_PHY_IPROC_NSP },
742	{ .compatible	= "brcm,iproc-sr-sata-phy",
743	  .data = (void *)BRCM_SATA_PHY_IPROC_SR },
744	{ .compatible	= "brcm,bcm63138-sata-phy",
745	  .data = (void *)BRCM_SATA_PHY_DSL_28NM },
746	{},
747};
748MODULE_DEVICE_TABLE(of, brcm_sata_phy_of_match);
749
750static int brcm_sata_phy_probe(struct platform_device *pdev)
751{
752	const char *rxaeq_mode;
753	struct device *dev = &pdev->dev;
754	struct device_node *dn = dev->of_node, *child;
755	const struct of_device_id *of_id;
756	struct brcm_sata_phy *priv;
757	struct phy_provider *provider;
758	int ret, count = 0;
759
760	if (of_get_child_count(dn) == 0)
761		return -ENODEV;
762
763	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
764	if (!priv)
765		return -ENOMEM;
766	dev_set_drvdata(dev, priv);
767	priv->dev = dev;
768
769	priv->phy_base = devm_platform_ioremap_resource_byname(pdev, "phy");
770	if (IS_ERR(priv->phy_base))
771		return PTR_ERR(priv->phy_base);
772
773	of_id = of_match_node(brcm_sata_phy_of_match, dn);
774	if (of_id)
775		priv->version = (uintptr_t)of_id->data;
776	else
777		priv->version = BRCM_SATA_PHY_STB_28NM;
778
779	if (priv->version == BRCM_SATA_PHY_IPROC_NS2) {
780		priv->ctrl_base = devm_platform_ioremap_resource_byname(pdev, "phy-ctrl");
781		if (IS_ERR(priv->ctrl_base))
782			return PTR_ERR(priv->ctrl_base);
783	}
784
785	for_each_available_child_of_node(dn, child) {
786		unsigned int id;
787		struct brcm_sata_port *port;
788
789		if (of_property_read_u32(child, "reg", &id)) {
790			dev_err(dev, "missing reg property in node %pOFn\n",
791					child);
792			ret = -EINVAL;
793			goto put_child;
794		}
795
796		if (id >= MAX_PORTS) {
797			dev_err(dev, "invalid reg: %u\n", id);
798			ret = -EINVAL;
799			goto put_child;
800		}
801		if (priv->phys[id].phy) {
802			dev_err(dev, "already registered port %u\n", id);
803			ret = -EINVAL;
804			goto put_child;
805		}
806
807		port = &priv->phys[id];
808		port->portnum = id;
809		port->phy_priv = priv;
810		port->phy = devm_phy_create(dev, child, &phy_ops);
811		port->rxaeq_mode = RXAEQ_MODE_OFF;
812		if (!of_property_read_string(child, "brcm,rxaeq-mode",
813					     &rxaeq_mode))
814			port->rxaeq_mode = rxaeq_to_val(rxaeq_mode);
815		if (port->rxaeq_mode == RXAEQ_MODE_MANUAL)
816			of_property_read_u32(child, "brcm,rxaeq-value",
817					     &port->rxaeq_val);
818
819		of_property_read_u32(child, "brcm,tx-amplitude-millivolt",
820				     &port->tx_amplitude_val);
821
822		port->ssc_en = of_property_read_bool(child, "brcm,enable-ssc");
823		if (IS_ERR(port->phy)) {
824			dev_err(dev, "failed to create PHY\n");
825			ret = PTR_ERR(port->phy);
826			goto put_child;
827		}
828
829		phy_set_drvdata(port->phy, port);
830		count++;
831	}
832
833	provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
834	if (IS_ERR(provider)) {
835		dev_err(dev, "could not register PHY provider\n");
836		return PTR_ERR(provider);
837	}
838
839	dev_info(dev, "registered %d port(s)\n", count);
840
841	return 0;
842put_child:
843	of_node_put(child);
844	return ret;
845}
846
847static struct platform_driver brcm_sata_phy_driver = {
848	.probe	= brcm_sata_phy_probe,
849	.driver	= {
850		.of_match_table	= brcm_sata_phy_of_match,
851		.name		= "brcm-sata-phy",
852	}
853};
854module_platform_driver(brcm_sata_phy_driver);
855
856MODULE_DESCRIPTION("Broadcom SATA PHY driver");
857MODULE_LICENSE("GPL");
858MODULE_AUTHOR("Marc Carino");
859MODULE_AUTHOR("Brian Norris");
860MODULE_ALIAS("platform:phy-brcm-sata");
1