pci-imx6.c 32.8 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0
2 3 4 5 6 7 8 9 10
/*
 * PCIe host controller driver for Freescale i.MX6 SoCs
 *
 * Copyright (C) 2013 Kosagi
 *		http://www.kosagi.com
 *
 * Author: Sean Cross <xobs@kosagi.com>
 */

11
#include <linux/bitfield.h>
12 13 14 15 16 17
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <linux/kernel.h>
#include <linux/mfd/syscon.h>
#include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
18
#include <linux/mfd/syscon/imx7-iomuxc-gpr.h>
19 20
#include <linux/module.h>
#include <linux/of_gpio.h>
21
#include <linux/of_device.h>
22
#include <linux/of_address.h>
23 24 25
#include <linux/pci.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
26
#include <linux/regulator/consumer.h>
27 28 29
#include <linux/resource.h>
#include <linux/signal.h>
#include <linux/types.h>
L
Lucas Stach 已提交
30
#include <linux/interrupt.h>
31
#include <linux/reset.h>
L
Leonard Crestez 已提交
32 33
#include <linux/pm_domain.h>
#include <linux/pm_runtime.h>
34 35 36

#include "pcie-designware.h"

37 38 39 40 41 42
#define IMX8MQ_GPR_PCIE_REF_USE_PAD		BIT(9)
#define IMX8MQ_GPR_PCIE_CLK_REQ_OVERRIDE_EN	BIT(10)
#define IMX8MQ_GPR_PCIE_CLK_REQ_OVERRIDE	BIT(11)
#define IMX8MQ_GPR12_PCIE2_CTRL_DEVICE_TYPE	GENMASK(11, 8)
#define IMX8MQ_PCIE2_BASE_ADDR			0x33c00000

43
#define to_imx6_pcie(x)	dev_get_drvdata((x)->dev)
44

45 46
enum imx6_pcie_variants {
	IMX6Q,
47 48
	IMX6SX,
	IMX6QP,
49
	IMX7D,
50
	IMX8MQ,
51 52
};

53
#define IMX6_PCIE_FLAG_IMX6_PHY			BIT(0)
54
#define IMX6_PCIE_FLAG_IMX6_SPEED_CHANGE	BIT(1)
55

A
Andrey Smirnov 已提交
56 57
struct imx6_pcie_drvdata {
	enum imx6_pcie_variants variant;
58
	u32 flags;
59 60
};

61
struct imx6_pcie {
62
	struct dw_pcie		*pci;
63
	int			reset_gpio;
64
	bool			gpio_active_high;
L
Lucas Stach 已提交
65 66
	struct clk		*pcie_bus;
	struct clk		*pcie_phy;
67
	struct clk		*pcie_inbound_axi;
L
Lucas Stach 已提交
68
	struct clk		*pcie;
69
	struct clk		*pcie_aux;
70
	struct regmap		*iomuxc_gpr;
71
	u32			controller_id;
72 73
	struct reset_control	*pciephy_reset;
	struct reset_control	*apps_reset;
74
	struct reset_control	*turnoff_reset;
75 76 77 78 79
	u32			tx_deemph_gen1;
	u32			tx_deemph_gen2_3p5db;
	u32			tx_deemph_gen2_6db;
	u32			tx_swing_full;
	u32			tx_swing_low;
80
	int			link_gen;
81
	struct regulator	*vpcie;
82
	void __iomem		*phy_base;
L
Leonard Crestez 已提交
83 84 85 86 87

	/* power domain for pcie */
	struct device		*pd_pcie;
	/* power domain for pcie phy */
	struct device		*pd_pcie_phy;
A
Andrey Smirnov 已提交
88
	const struct imx6_pcie_drvdata *drvdata;
89 90
};

91 92
/* Parameters for the waiting for PCIe PHY PLL to lock on i.MX7 */
#define PHY_PLL_LOCK_WAIT_USLEEP_MAX	200
93
#define PHY_PLL_LOCK_WAIT_TIMEOUT	(2000 * PHY_PLL_LOCK_WAIT_USLEEP_MAX)
94

95
/* PCIe Root Complex registers (memory-mapped) */
96
#define PCIE_RC_IMX6_MSI_CAP			0x50
97 98 99 100 101
#define PCIE_RC_LCR				0x7c
#define PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN1	0x1
#define PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN2	0x2
#define PCIE_RC_LCR_MAX_LINK_SPEEDS_MASK	0xf

102 103
#define PCIE_RC_LCSR				0x80

104 105 106 107
/* PCIe Port Logic registers (memory-mapped) */
#define PL_OFFSET 0x700

#define PCIE_PHY_CTRL (PL_OFFSET + 0x114)
108 109 110 111 112
#define PCIE_PHY_CTRL_DATA(x)		FIELD_PREP(GENMASK(15, 0), (x))
#define PCIE_PHY_CTRL_CAP_ADR		BIT(16)
#define PCIE_PHY_CTRL_CAP_DAT		BIT(17)
#define PCIE_PHY_CTRL_WR		BIT(18)
#define PCIE_PHY_CTRL_RD		BIT(19)
113 114

#define PCIE_PHY_STAT (PL_OFFSET + 0x110)
115
#define PCIE_PHY_STAT_ACK		BIT(16)
116

117 118
#define PCIE_LINK_WIDTH_SPEED_CONTROL	0x80C

119
/* PHY registers (not memory-mapped) */
120
#define PCIE_PHY_ATEOVRD			0x10
121
#define  PCIE_PHY_ATEOVRD_EN			BIT(2)
122 123 124 125 126 127
#define  PCIE_PHY_ATEOVRD_REF_CLKDIV_SHIFT	0
#define  PCIE_PHY_ATEOVRD_REF_CLKDIV_MASK	0x1

#define PCIE_PHY_MPLL_OVRD_IN_LO		0x11
#define  PCIE_PHY_MPLL_MULTIPLIER_SHIFT		2
#define  PCIE_PHY_MPLL_MULTIPLIER_MASK		0x7f
128
#define  PCIE_PHY_MPLL_MULTIPLIER_OVRD		BIT(9)
129

130
#define PCIE_PHY_RX_ASIC_OUT 0x100D
131
#define PCIE_PHY_RX_ASIC_OUT_VALID	(1 << 0)
132

133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
/* iMX7 PCIe PHY registers */
#define PCIE_PHY_CMN_REG4		0x14
/* These are probably the bits that *aren't* DCC_FB_EN */
#define PCIE_PHY_CMN_REG4_DCC_FB_EN	0x29

#define PCIE_PHY_CMN_REG15	        0x54
#define PCIE_PHY_CMN_REG15_DLY_4	BIT(2)
#define PCIE_PHY_CMN_REG15_PLL_PD	BIT(5)
#define PCIE_PHY_CMN_REG15_OVRD_PLL_PD	BIT(7)

#define PCIE_PHY_CMN_REG24		0x90
#define PCIE_PHY_CMN_REG24_RX_EQ	BIT(6)
#define PCIE_PHY_CMN_REG24_RX_EQ_SEL	BIT(3)

#define PCIE_PHY_CMN_REG26		0x98
#define PCIE_PHY_CMN_REG26_ATT_MODE	0xBC

150
#define PHY_RX_OVRD_IN_LO 0x1005
151 152
#define PHY_RX_OVRD_IN_LO_RX_DATA_EN		BIT(5)
#define PHY_RX_OVRD_IN_LO_RX_PLL_EN		BIT(3)
153

154
static int pcie_phy_poll_ack(struct imx6_pcie *imx6_pcie, bool exp_val)
155
{
156
	struct dw_pcie *pci = imx6_pcie->pci;
157
	bool val;
158 159 160 161
	u32 max_iterations = 10;
	u32 wait_counter = 0;

	do {
162 163
		val = dw_pcie_readl_dbi(pci, PCIE_PHY_STAT) &
			PCIE_PHY_STAT_ACK;
164 165 166 167 168 169 170 171 172 173 174
		wait_counter++;

		if (val == exp_val)
			return 0;

		udelay(1);
	} while (wait_counter < max_iterations);

	return -ETIMEDOUT;
}

175
static int pcie_phy_wait_ack(struct imx6_pcie *imx6_pcie, int addr)
176
{
177
	struct dw_pcie *pci = imx6_pcie->pci;
178 179 180
	u32 val;
	int ret;

181
	val = PCIE_PHY_CTRL_DATA(addr);
182
	dw_pcie_writel_dbi(pci, PCIE_PHY_CTRL, val);
183

184
	val |= PCIE_PHY_CTRL_CAP_ADR;
185
	dw_pcie_writel_dbi(pci, PCIE_PHY_CTRL, val);
186

187
	ret = pcie_phy_poll_ack(imx6_pcie, true);
188 189 190
	if (ret)
		return ret;

191
	val = PCIE_PHY_CTRL_DATA(addr);
192
	dw_pcie_writel_dbi(pci, PCIE_PHY_CTRL, val);
193

194
	return pcie_phy_poll_ack(imx6_pcie, false);
195 196 197
}

/* Read from the 16-bit PCIe PHY control registers (not memory-mapped) */
198
static int pcie_phy_read(struct imx6_pcie *imx6_pcie, int addr, u16 *data)
199
{
200
	struct dw_pcie *pci = imx6_pcie->pci;
201
	u32 phy_ctl;
202 203
	int ret;

204
	ret = pcie_phy_wait_ack(imx6_pcie, addr);
205 206 207 208
	if (ret)
		return ret;

	/* assert Read signal */
209
	phy_ctl = PCIE_PHY_CTRL_RD;
210
	dw_pcie_writel_dbi(pci, PCIE_PHY_CTRL, phy_ctl);
211

212
	ret = pcie_phy_poll_ack(imx6_pcie, true);
213 214 215
	if (ret)
		return ret;

216
	*data = dw_pcie_readl_dbi(pci, PCIE_PHY_STAT);
217 218

	/* deassert Read signal */
219
	dw_pcie_writel_dbi(pci, PCIE_PHY_CTRL, 0x00);
220

221
	return pcie_phy_poll_ack(imx6_pcie, false);
222 223
}

224
static int pcie_phy_write(struct imx6_pcie *imx6_pcie, int addr, u16 data)
225
{
226
	struct dw_pcie *pci = imx6_pcie->pci;
227 228 229 230 231
	u32 var;
	int ret;

	/* write addr */
	/* cap addr */
232
	ret = pcie_phy_wait_ack(imx6_pcie, addr);
233 234 235
	if (ret)
		return ret;

236
	var = PCIE_PHY_CTRL_DATA(data);
237
	dw_pcie_writel_dbi(pci, PCIE_PHY_CTRL, var);
238 239

	/* capture data */
240
	var |= PCIE_PHY_CTRL_CAP_DAT;
241
	dw_pcie_writel_dbi(pci, PCIE_PHY_CTRL, var);
242

243
	ret = pcie_phy_poll_ack(imx6_pcie, true);
244 245 246 247
	if (ret)
		return ret;

	/* deassert cap data */
248
	var = PCIE_PHY_CTRL_DATA(data);
249
	dw_pcie_writel_dbi(pci, PCIE_PHY_CTRL, var);
250 251

	/* wait for ack de-assertion */
252
	ret = pcie_phy_poll_ack(imx6_pcie, false);
253 254 255 256
	if (ret)
		return ret;

	/* assert wr signal */
257
	var = PCIE_PHY_CTRL_WR;
258
	dw_pcie_writel_dbi(pci, PCIE_PHY_CTRL, var);
259 260

	/* wait for ack */
261
	ret = pcie_phy_poll_ack(imx6_pcie, true);
262 263 264 265
	if (ret)
		return ret;

	/* deassert wr signal */
266
	var = PCIE_PHY_CTRL_DATA(data);
267
	dw_pcie_writel_dbi(pci, PCIE_PHY_CTRL, var);
268 269

	/* wait for ack de-assertion */
270
	ret = pcie_phy_poll_ack(imx6_pcie, false);
271 272 273
	if (ret)
		return ret;

274
	dw_pcie_writel_dbi(pci, PCIE_PHY_CTRL, 0x0);
275 276 277 278

	return 0;
}

279
static void imx6_pcie_reset_phy(struct imx6_pcie *imx6_pcie)
280
{
281
	u16 tmp;
282

283 284 285
	if (!(imx6_pcie->drvdata->flags & IMX6_PCIE_FLAG_IMX6_PHY))
		return;

286
	pcie_phy_read(imx6_pcie, PHY_RX_OVRD_IN_LO, &tmp);
287 288
	tmp |= (PHY_RX_OVRD_IN_LO_RX_DATA_EN |
		PHY_RX_OVRD_IN_LO_RX_PLL_EN);
289
	pcie_phy_write(imx6_pcie, PHY_RX_OVRD_IN_LO, tmp);
290 291 292

	usleep_range(2000, 3000);

293
	pcie_phy_read(imx6_pcie, PHY_RX_OVRD_IN_LO, &tmp);
294 295
	tmp &= ~(PHY_RX_OVRD_IN_LO_RX_DATA_EN |
		  PHY_RX_OVRD_IN_LO_RX_PLL_EN);
296
	pcie_phy_write(imx6_pcie, PHY_RX_OVRD_IN_LO, tmp);
297 298
}

299
#ifdef CONFIG_ARM
300 301 302 303
/*  Added for PCI abort handling */
static int imx6q_pcie_abort_handler(unsigned long addr,
		unsigned int fsr, struct pt_regs *regs)
{
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331
	unsigned long pc = instruction_pointer(regs);
	unsigned long instr = *(unsigned long *)pc;
	int reg = (instr >> 12) & 15;

	/*
	 * If the instruction being executed was a read,
	 * make it look like it read all-ones.
	 */
	if ((instr & 0x0c100000) == 0x04100000) {
		unsigned long val;

		if (instr & 0x00400000)
			val = 255;
		else
			val = -1;

		regs->uregs[reg] = val;
		regs->ARM_pc += 4;
		return 0;
	}

	if ((instr & 0x0e100090) == 0x00100090) {
		regs->uregs[reg] = -1;
		regs->ARM_pc += 4;
		return 0;
	}

	return 1;
332
}
333
#endif
334

L
Leonard Crestez 已提交
335 336 337 338 339 340 341 342 343 344 345 346
static int imx6_pcie_attach_pd(struct device *dev)
{
	struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev);
	struct device_link *link;

	/* Do nothing when in a single power domain */
	if (dev->pm_domain)
		return 0;

	imx6_pcie->pd_pcie = dev_pm_domain_attach_by_name(dev, "pcie");
	if (IS_ERR(imx6_pcie->pd_pcie))
		return PTR_ERR(imx6_pcie->pd_pcie);
347 348 349
	/* Do nothing when power domain missing */
	if (!imx6_pcie->pd_pcie)
		return 0;
L
Leonard Crestez 已提交
350 351 352 353 354 355 356 357 358 359 360 361 362
	link = device_link_add(dev, imx6_pcie->pd_pcie,
			DL_FLAG_STATELESS |
			DL_FLAG_PM_RUNTIME |
			DL_FLAG_RPM_ACTIVE);
	if (!link) {
		dev_err(dev, "Failed to add device_link to pcie pd.\n");
		return -EINVAL;
	}

	imx6_pcie->pd_pcie_phy = dev_pm_domain_attach_by_name(dev, "pcie_phy");
	if (IS_ERR(imx6_pcie->pd_pcie_phy))
		return PTR_ERR(imx6_pcie->pd_pcie_phy);

363
	link = device_link_add(dev, imx6_pcie->pd_pcie_phy,
L
Leonard Crestez 已提交
364 365 366
			DL_FLAG_STATELESS |
			DL_FLAG_PM_RUNTIME |
			DL_FLAG_RPM_ACTIVE);
367 368 369
	if (!link) {
		dev_err(dev, "Failed to add device_link to pcie_phy pd.\n");
		return -EINVAL;
L
Leonard Crestez 已提交
370 371 372 373 374
	}

	return 0;
}

375
static void imx6_pcie_assert_core_reset(struct imx6_pcie *imx6_pcie)
376
{
377 378
	struct device *dev = imx6_pcie->pci->dev;

A
Andrey Smirnov 已提交
379
	switch (imx6_pcie->drvdata->variant) {
380
	case IMX7D:
381
	case IMX8MQ:
382 383 384
		reset_control_assert(imx6_pcie->pciephy_reset);
		reset_control_assert(imx6_pcie->apps_reset);
		break;
385
	case IMX6SX:
386 387 388 389 390 391 392
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
				   IMX6SX_GPR12_PCIE_TEST_POWERDOWN,
				   IMX6SX_GPR12_PCIE_TEST_POWERDOWN);
		/* Force PCIe PHY reset */
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5,
				   IMX6SX_GPR5_PCIE_BTNRST_RESET,
				   IMX6SX_GPR5_PCIE_BTNRST_RESET);
393
		break;
394 395 396 397 398
	case IMX6QP:
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
				   IMX6Q_GPR1_PCIE_SW_RST,
				   IMX6Q_GPR1_PCIE_SW_RST);
		break;
399 400 401 402 403 404
	case IMX6Q:
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
				   IMX6Q_GPR1_PCIE_TEST_PD, 1 << 18);
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
				   IMX6Q_GPR1_PCIE_REF_CLK_EN, 0 << 16);
		break;
405
	}
406 407 408 409 410 411 412 413

	if (imx6_pcie->vpcie && regulator_is_enabled(imx6_pcie->vpcie) > 0) {
		int ret = regulator_disable(imx6_pcie->vpcie);

		if (ret)
			dev_err(dev, "failed to disable vpcie regulator: %d\n",
				ret);
	}
414 415
}

416 417 418 419 420 421
static unsigned int imx6_pcie_grp_offset(const struct imx6_pcie *imx6_pcie)
{
	WARN_ON(imx6_pcie->drvdata->variant != IMX8MQ);
	return imx6_pcie->controller_id == 1 ? IOMUXC_GPR16 : IOMUXC_GPR14;
}

422 423
static int imx6_pcie_enable_ref_clk(struct imx6_pcie *imx6_pcie)
{
424 425
	struct dw_pcie *pci = imx6_pcie->pci;
	struct device *dev = pci->dev;
426
	unsigned int offset;
427
	int ret = 0;
428

A
Andrey Smirnov 已提交
429
	switch (imx6_pcie->drvdata->variant) {
430
	case IMX6SX:
431 432
		ret = clk_prepare_enable(imx6_pcie->pcie_inbound_axi);
		if (ret) {
433
			dev_err(dev, "unable to enable pcie_axi clock\n");
434
			break;
435 436 437 438
		}

		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
				   IMX6SX_GPR12_PCIE_TEST_POWERDOWN, 0);
439
		break;
440
	case IMX6QP:		/* FALLTHROUGH */
441 442 443 444 445 446 447 448 449 450 451 452 453 454
	case IMX6Q:
		/* power up core phy and enable ref clock */
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
				   IMX6Q_GPR1_PCIE_TEST_PD, 0 << 18);
		/*
		 * the async reset input need ref clock to sync internally,
		 * when the ref clock comes after reset, internal synced
		 * reset time is too short, cannot meet the requirement.
		 * add one ~10us delay here.
		 */
		udelay(10);
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
				   IMX6Q_GPR1_PCIE_REF_CLK_EN, 1 << 16);
		break;
455 456
	case IMX7D:
		break;
457
	case IMX8MQ:
458 459 460 461 462 463
		ret = clk_prepare_enable(imx6_pcie->pcie_aux);
		if (ret) {
			dev_err(dev, "unable to enable pcie_aux clock\n");
			break;
		}

464 465 466 467 468 469 470 471 472 473 474 475
		offset = imx6_pcie_grp_offset(imx6_pcie);
		/*
		 * Set the over ride low and enabled
		 * make sure that REF_CLK is turned on.
		 */
		regmap_update_bits(imx6_pcie->iomuxc_gpr, offset,
				   IMX8MQ_GPR_PCIE_CLK_REQ_OVERRIDE,
				   0);
		regmap_update_bits(imx6_pcie->iomuxc_gpr, offset,
				   IMX8MQ_GPR_PCIE_CLK_REQ_OVERRIDE_EN,
				   IMX8MQ_GPR_PCIE_CLK_REQ_OVERRIDE_EN);
		break;
476 477
	}

478
	return ret;
479 480
}

481 482 483 484 485
static void imx7d_pcie_wait_for_phy_pll_lock(struct imx6_pcie *imx6_pcie)
{
	u32 val;
	struct device *dev = imx6_pcie->pci->dev;

486 487 488 489 490 491
	if (regmap_read_poll_timeout(imx6_pcie->iomuxc_gpr,
				     IOMUXC_GPR22, val,
				     val & IMX7D_GPR22_PCIE_PHY_PLL_LOCKED,
				     PHY_PLL_LOCK_WAIT_USLEEP_MAX,
				     PHY_PLL_LOCK_WAIT_TIMEOUT))
		dev_err(dev, "PCIe PLL lock timeout\n");
492 493
}

494
static void imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
495
{
496 497
	struct dw_pcie *pci = imx6_pcie->pci;
	struct device *dev = pci->dev;
498 499
	int ret;

500 501 502 503 504 505 506 507 508
	if (imx6_pcie->vpcie && !regulator_is_enabled(imx6_pcie->vpcie)) {
		ret = regulator_enable(imx6_pcie->vpcie);
		if (ret) {
			dev_err(dev, "failed to enable vpcie regulator: %d\n",
				ret);
			return;
		}
	}

L
Lucas Stach 已提交
509
	ret = clk_prepare_enable(imx6_pcie->pcie_phy);
510
	if (ret) {
511
		dev_err(dev, "unable to enable pcie_phy clock\n");
512
		goto err_pcie_phy;
513 514
	}

L
Lucas Stach 已提交
515
	ret = clk_prepare_enable(imx6_pcie->pcie_bus);
516
	if (ret) {
517
		dev_err(dev, "unable to enable pcie_bus clock\n");
L
Lucas Stach 已提交
518
		goto err_pcie_bus;
519 520
	}

L
Lucas Stach 已提交
521
	ret = clk_prepare_enable(imx6_pcie->pcie);
522
	if (ret) {
523
		dev_err(dev, "unable to enable pcie clock\n");
L
Lucas Stach 已提交
524
		goto err_pcie;
525 526
	}

527 528
	ret = imx6_pcie_enable_ref_clk(imx6_pcie);
	if (ret) {
529
		dev_err(dev, "unable to enable pcie ref clock\n");
530 531
		goto err_ref_clk;
	}
532

533 534 535
	/* allow the clocks to stabilize */
	usleep_range(200, 500);

536
	/* Some boards don't have PCIe reset GPIO. */
537
	if (gpio_is_valid(imx6_pcie->reset_gpio)) {
538 539
		gpio_set_value_cansleep(imx6_pcie->reset_gpio,
					imx6_pcie->gpio_active_high);
540
		msleep(100);
541 542
		gpio_set_value_cansleep(imx6_pcie->reset_gpio,
					!imx6_pcie->gpio_active_high);
543
	}
544

A
Andrey Smirnov 已提交
545
	switch (imx6_pcie->drvdata->variant) {
546 547 548
	case IMX8MQ:
		reset_control_deassert(imx6_pcie->pciephy_reset);
		break;
549 550
	case IMX7D:
		reset_control_deassert(imx6_pcie->pciephy_reset);
551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570

		/* Workaround for ERR010728, failure of PCI-e PLL VCO to
		 * oscillate, especially when cold.  This turns off "Duty-cycle
		 * Corrector" and other mysterious undocumented things.
		 */
		if (likely(imx6_pcie->phy_base)) {
			/* De-assert DCC_FB_EN */
			writel(PCIE_PHY_CMN_REG4_DCC_FB_EN,
			       imx6_pcie->phy_base + PCIE_PHY_CMN_REG4);
			/* Assert RX_EQS and RX_EQS_SEL */
			writel(PCIE_PHY_CMN_REG24_RX_EQ_SEL
				| PCIE_PHY_CMN_REG24_RX_EQ,
			       imx6_pcie->phy_base + PCIE_PHY_CMN_REG24);
			/* Assert ATT_MODE */
			writel(PCIE_PHY_CMN_REG26_ATT_MODE,
			       imx6_pcie->phy_base + PCIE_PHY_CMN_REG26);
		} else {
			dev_warn(dev, "Unable to apply ERR010728 workaround. DT missing fsl,imx7d-pcie-phy phandle ?\n");
		}

571 572
		imx7d_pcie_wait_for_phy_pll_lock(imx6_pcie);
		break;
573
	case IMX6SX:
574 575
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5,
				   IMX6SX_GPR5_PCIE_BTNRST_RESET, 0);
576 577 578 579 580 581 582 583 584 585
		break;
	case IMX6QP:
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
				   IMX6Q_GPR1_PCIE_SW_RST, 0);

		usleep_range(200, 500);
		break;
	case IMX6Q:		/* Nothing to do */
		break;
	}
586

587
	return;
588

589 590
err_ref_clk:
	clk_disable_unprepare(imx6_pcie->pcie);
L
Lucas Stach 已提交
591 592 593 594
err_pcie:
	clk_disable_unprepare(imx6_pcie->pcie_bus);
err_pcie_bus:
	clk_disable_unprepare(imx6_pcie->pcie_phy);
595 596 597 598 599 600 601
err_pcie_phy:
	if (imx6_pcie->vpcie && regulator_is_enabled(imx6_pcie->vpcie) > 0) {
		ret = regulator_disable(imx6_pcie->vpcie);
		if (ret)
			dev_err(dev, "failed to disable vpcie regulator: %d\n",
				ret);
	}
602 603
}

604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621
static void imx6_pcie_configure_type(struct imx6_pcie *imx6_pcie)
{
	unsigned int mask, val;

	if (imx6_pcie->drvdata->variant == IMX8MQ &&
	    imx6_pcie->controller_id == 1) {
		mask   = IMX8MQ_GPR12_PCIE2_CTRL_DEVICE_TYPE;
		val    = FIELD_PREP(IMX8MQ_GPR12_PCIE2_CTRL_DEVICE_TYPE,
				    PCI_EXP_TYPE_ROOT_PORT);
	} else {
		mask = IMX6Q_GPR12_DEVICE_TYPE;
		val  = FIELD_PREP(IMX6Q_GPR12_DEVICE_TYPE,
				  PCI_EXP_TYPE_ROOT_PORT);
	}

	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, mask, val);
}

622
static void imx6_pcie_init_phy(struct imx6_pcie *imx6_pcie)
623
{
A
Andrey Smirnov 已提交
624
	switch (imx6_pcie->drvdata->variant) {
625 626 627 628 629 630 631 632 633 634
	case IMX8MQ:
		/*
		 * TODO: Currently this code assumes external
		 * oscillator is being used
		 */
		regmap_update_bits(imx6_pcie->iomuxc_gpr,
				   imx6_pcie_grp_offset(imx6_pcie),
				   IMX8MQ_GPR_PCIE_REF_USE_PAD,
				   IMX8MQ_GPR_PCIE_REF_USE_PAD);
		break;
635 636 637 638 639
	case IMX7D:
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
				   IMX7D_GPR12_PCIE_PHY_REFCLK_SEL, 0);
		break;
	case IMX6SX:
640 641 642
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
				   IMX6SX_GPR12_PCIE_RX_EQ_MASK,
				   IMX6SX_GPR12_PCIE_RX_EQ_2);
643 644 645 646
		/* FALLTHROUGH */
	default:
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
				   IMX6Q_GPR12_PCIE_CTL_2, 0 << 10);
647

648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668
		/* configure constant input signal to the pcie ctrl and phy */
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
				   IMX6Q_GPR12_LOS_LEVEL, 9 << 4);

		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
				   IMX6Q_GPR8_TX_DEEMPH_GEN1,
				   imx6_pcie->tx_deemph_gen1 << 0);
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
				   IMX6Q_GPR8_TX_DEEMPH_GEN2_3P5DB,
				   imx6_pcie->tx_deemph_gen2_3p5db << 6);
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
				   IMX6Q_GPR8_TX_DEEMPH_GEN2_6DB,
				   imx6_pcie->tx_deemph_gen2_6db << 12);
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
				   IMX6Q_GPR8_TX_SWING_FULL,
				   imx6_pcie->tx_swing_full << 18);
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
				   IMX6Q_GPR8_TX_SWING_LOW,
				   imx6_pcie->tx_swing_low << 25);
		break;
	}
669

670
	imx6_pcie_configure_type(imx6_pcie);
671 672
}

673 674 675 676
static int imx6_setup_phy_mpll(struct imx6_pcie *imx6_pcie)
{
	unsigned long phy_rate = clk_get_rate(imx6_pcie->pcie_phy);
	int mult, div;
677
	u16 val;
678

679 680 681
	if (!(imx6_pcie->drvdata->flags & IMX6_PCIE_FLAG_IMX6_PHY))
		return 0;

682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719
	switch (phy_rate) {
	case 125000000:
		/*
		 * The default settings of the MPLL are for a 125MHz input
		 * clock, so no need to reconfigure anything in that case.
		 */
		return 0;
	case 100000000:
		mult = 25;
		div = 0;
		break;
	case 200000000:
		mult = 25;
		div = 1;
		break;
	default:
		dev_err(imx6_pcie->pci->dev,
			"Unsupported PHY reference clock rate %lu\n", phy_rate);
		return -EINVAL;
	}

	pcie_phy_read(imx6_pcie, PCIE_PHY_MPLL_OVRD_IN_LO, &val);
	val &= ~(PCIE_PHY_MPLL_MULTIPLIER_MASK <<
		 PCIE_PHY_MPLL_MULTIPLIER_SHIFT);
	val |= mult << PCIE_PHY_MPLL_MULTIPLIER_SHIFT;
	val |= PCIE_PHY_MPLL_MULTIPLIER_OVRD;
	pcie_phy_write(imx6_pcie, PCIE_PHY_MPLL_OVRD_IN_LO, val);

	pcie_phy_read(imx6_pcie, PCIE_PHY_ATEOVRD, &val);
	val &= ~(PCIE_PHY_ATEOVRD_REF_CLKDIV_MASK <<
		 PCIE_PHY_ATEOVRD_REF_CLKDIV_SHIFT);
	val |= div << PCIE_PHY_ATEOVRD_REF_CLKDIV_SHIFT;
	val |= PCIE_PHY_ATEOVRD_EN;
	pcie_phy_write(imx6_pcie, PCIE_PHY_ATEOVRD, val);

	return 0;
}

720
static int imx6_pcie_wait_for_speed_change(struct imx6_pcie *imx6_pcie)
721
{
722 723
	struct dw_pcie *pci = imx6_pcie->pci;
	struct device *dev = pci->dev;
724
	u32 tmp;
725 726 727
	unsigned int retries;

	for (retries = 0; retries < 200; retries++) {
728
		tmp = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL);
729 730 731 732 733 734
		/* Test if the speed change finished. */
		if (!(tmp & PORT_LOGIC_SPEED_CHANGE))
			return 0;
		usleep_range(100, 1000);
	}

735
	dev_err(dev, "Speed change timeout\n");
736
	return -ETIMEDOUT;
737 738
}

739 740 741 742
static void imx6_pcie_ltssm_enable(struct device *dev)
{
	struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev);

A
Andrey Smirnov 已提交
743
	switch (imx6_pcie->drvdata->variant) {
744 745 746 747 748 749 750 751
	case IMX6Q:
	case IMX6SX:
	case IMX6QP:
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
				   IMX6Q_GPR12_PCIE_CTL_2,
				   IMX6Q_GPR12_PCIE_CTL_2);
		break;
	case IMX7D:
752
	case IMX8MQ:
753 754 755 756 757
		reset_control_deassert(imx6_pcie->apps_reset);
		break;
	}
}

758
static int imx6_pcie_establish_link(struct imx6_pcie *imx6_pcie)
759
{
760 761
	struct dw_pcie *pci = imx6_pcie->pci;
	struct device *dev = pci->dev;
762
	u32 tmp;
763
	int ret;
764 765 766 767 768 769

	/*
	 * Force Gen1 operation when starting the link.  In case the link is
	 * started in Gen2 mode, there is a possibility the devices on the
	 * bus will not be detected at all.  This happens with PCIe switches.
	 */
770
	tmp = dw_pcie_readl_dbi(pci, PCIE_RC_LCR);
771 772
	tmp &= ~PCIE_RC_LCR_MAX_LINK_SPEEDS_MASK;
	tmp |= PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN1;
773
	dw_pcie_writel_dbi(pci, PCIE_RC_LCR, tmp);
774 775

	/* Start LTSSM. */
776
	imx6_pcie_ltssm_enable(dev);
777

778
	ret = dw_pcie_wait_for_link(pci);
779
	if (ret)
780
		goto err_reset_phy;
781

782 783
	if (imx6_pcie->link_gen == 2) {
		/* Allow Gen2 mode after the link is up. */
784
		tmp = dw_pcie_readl_dbi(pci, PCIE_RC_LCR);
785 786
		tmp &= ~PCIE_RC_LCR_MAX_LINK_SPEEDS_MASK;
		tmp |= PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN2;
787
		dw_pcie_writel_dbi(pci, PCIE_RC_LCR, tmp);
788

789
		/*
790 791
		 * Start Directed Speed Change so the best possible
		 * speed both link partners support can be negotiated.
792
		 */
793 794 795 796
		tmp = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL);
		tmp |= PORT_LOGIC_SPEED_CHANGE;
		dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, tmp);

797 798
		if (imx6_pcie->drvdata->flags &
		    IMX6_PCIE_FLAG_IMX6_SPEED_CHANGE) {
799 800 801 802 803 804 805 806 807 808 809 810 811 812 813
			/*
			 * On i.MX7, DIRECT_SPEED_CHANGE behaves differently
			 * from i.MX6 family when no link speed transition
			 * occurs and we go Gen1 -> yep, Gen1. The difference
			 * is that, in such case, it will not be cleared by HW
			 * which will cause the following code to report false
			 * failure.
			 */

			ret = imx6_pcie_wait_for_speed_change(imx6_pcie);
			if (ret) {
				dev_err(dev, "Failed to bring link up!\n");
				goto err_reset_phy;
			}
		}
814

815
		/* Make sure link training is finished as well! */
816
		ret = dw_pcie_wait_for_link(pci);
817 818 819 820
		if (ret) {
			dev_err(dev, "Failed to bring link up!\n");
			goto err_reset_phy;
		}
821 822
	} else {
		dev_info(dev, "Link: Gen2 disabled\n");
823 824
	}

825
	tmp = dw_pcie_readl_dbi(pci, PCIE_RC_LCSR);
826
	dev_info(dev, "Link up, Gen%i\n", (tmp >> 16) & 0xf);
827
	return 0;
828 829

err_reset_phy:
830
	dev_dbg(dev, "PHY DEBUG_R0=0x%08x DEBUG_R1=0x%08x\n",
831 832
		dw_pcie_readl_dbi(pci, PCIE_PORT_DEBUG0),
		dw_pcie_readl_dbi(pci, PCIE_PORT_DEBUG1));
833
	imx6_pcie_reset_phy(imx6_pcie);
834
	return ret;
835 836
}

837
static int imx6_pcie_host_init(struct pcie_port *pp)
838
{
839 840
	struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
	struct imx6_pcie *imx6_pcie = to_imx6_pcie(pci);
841

842 843 844
	imx6_pcie_assert_core_reset(imx6_pcie);
	imx6_pcie_init_phy(imx6_pcie);
	imx6_pcie_deassert_core_reset(imx6_pcie);
845
	imx6_setup_phy_mpll(imx6_pcie);
846
	dw_pcie_setup_rc(pp);
847
	imx6_pcie_establish_link(imx6_pcie);
L
Lucas Stach 已提交
848 849 850

	if (IS_ENABLED(CONFIG_PCI_MSI))
		dw_pcie_msi_init(pp);
851 852

	return 0;
853 854
}

855
static const struct dw_pcie_host_ops imx6_pcie_host_ops = {
856 857 858
	.host_init = imx6_pcie_host_init,
};

859 860
static int imx6_add_pcie_port(struct imx6_pcie *imx6_pcie,
			      struct platform_device *pdev)
861
{
862 863 864
	struct dw_pcie *pci = imx6_pcie->pci;
	struct pcie_port *pp = &pci->pp;
	struct device *dev = &pdev->dev;
865 866
	int ret;

L
Lucas Stach 已提交
867 868 869
	if (IS_ENABLED(CONFIG_PCI_MSI)) {
		pp->msi_irq = platform_get_irq_byname(pdev, "msi");
		if (pp->msi_irq <= 0) {
870
			dev_err(dev, "failed to get MSI irq\n");
L
Lucas Stach 已提交
871 872 873 874
			return -ENODEV;
		}
	}

875 876 877 878
	pp->ops = &imx6_pcie_host_ops;

	ret = dw_pcie_host_init(pp);
	if (ret) {
879
		dev_err(dev, "failed to initialize host\n");
880 881 882 883 884 885
		return ret;
	}

	return 0;
}

886
static const struct dw_pcie_ops dw_pcie_ops = {
887
	/* No special ops needed, but pcie-designware still expects this struct */
888 889
};

890 891 892 893 894
#ifdef CONFIG_PM_SLEEP
static void imx6_pcie_ltssm_disable(struct device *dev)
{
	struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev);

A
Andrey Smirnov 已提交
895
	switch (imx6_pcie->drvdata->variant) {
896 897 898 899 900 901 902 903 904 905 906 907 908
	case IMX6SX:
	case IMX6QP:
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
				   IMX6Q_GPR12_PCIE_CTL_2, 0);
		break;
	case IMX7D:
		reset_control_assert(imx6_pcie->apps_reset);
		break;
	default:
		dev_err(dev, "ltssm_disable not supported\n");
	}
}

909 910
static void imx6_pcie_pm_turnoff(struct imx6_pcie *imx6_pcie)
{
911 912 913 914 915 916 917 918 919 920
	struct device *dev = imx6_pcie->pci->dev;

	/* Some variants have a turnoff reset in DT */
	if (imx6_pcie->turnoff_reset) {
		reset_control_assert(imx6_pcie->turnoff_reset);
		reset_control_deassert(imx6_pcie->turnoff_reset);
		goto pm_turnoff_sleep;
	}

	/* Others poke directly at IOMUXC registers */
A
Andrey Smirnov 已提交
921
	switch (imx6_pcie->drvdata->variant) {
922 923 924 925 926 927 928 929 930 931 932
	case IMX6SX:
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
				IMX6SX_GPR12_PCIE_PM_TURN_OFF,
				IMX6SX_GPR12_PCIE_PM_TURN_OFF);
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
				IMX6SX_GPR12_PCIE_PM_TURN_OFF, 0);
		break;
	default:
		dev_err(dev, "PME_Turn_Off not implemented\n");
		return;
	}
933 934 935 936 937 938 939 940

	/*
	 * Components with an upstream port must respond to
	 * PME_Turn_Off with PME_TO_Ack but we can't check.
	 *
	 * The standard recommends a 1-10ms timeout after which to
	 * proceed anyway as if acks were received.
	 */
941
pm_turnoff_sleep:
942 943 944
	usleep_range(1000, 10000);
}

945 946 947 948 949 950
static void imx6_pcie_clk_disable(struct imx6_pcie *imx6_pcie)
{
	clk_disable_unprepare(imx6_pcie->pcie);
	clk_disable_unprepare(imx6_pcie->pcie_phy);
	clk_disable_unprepare(imx6_pcie->pcie_bus);

A
Andrey Smirnov 已提交
951
	switch (imx6_pcie->drvdata->variant) {
952 953 954 955
	case IMX6SX:
		clk_disable_unprepare(imx6_pcie->pcie_inbound_axi);
		break;
	case IMX7D:
956 957 958
		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
				   IMX7D_GPR12_PCIE_PHY_REFCLK_SEL,
				   IMX7D_GPR12_PCIE_PHY_REFCLK_SEL);
959
		break;
960 961 962
	case IMX8MQ:
		clk_disable_unprepare(imx6_pcie->pcie_aux);
		break;
963 964
	default:
		break;
965 966 967
	}
}

968 969
static inline bool imx6_pcie_supports_suspend(struct imx6_pcie *imx6_pcie)
{
A
Andrey Smirnov 已提交
970 971
	return (imx6_pcie->drvdata->variant == IMX7D ||
		imx6_pcie->drvdata->variant == IMX6SX);
972 973
}

974 975 976 977
static int imx6_pcie_suspend_noirq(struct device *dev)
{
	struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev);

978
	if (!imx6_pcie_supports_suspend(imx6_pcie))
979 980
		return 0;

981
	imx6_pcie_pm_turnoff(imx6_pcie);
982 983 984 985 986 987 988 989 990 991 992 993
	imx6_pcie_clk_disable(imx6_pcie);
	imx6_pcie_ltssm_disable(dev);

	return 0;
}

static int imx6_pcie_resume_noirq(struct device *dev)
{
	int ret;
	struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev);
	struct pcie_port *pp = &imx6_pcie->pci->pp;

994
	if (!imx6_pcie_supports_suspend(imx6_pcie))
995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014
		return 0;

	imx6_pcie_assert_core_reset(imx6_pcie);
	imx6_pcie_init_phy(imx6_pcie);
	imx6_pcie_deassert_core_reset(imx6_pcie);
	dw_pcie_setup_rc(pp);

	ret = imx6_pcie_establish_link(imx6_pcie);
	if (ret < 0)
		dev_info(dev, "pcie link is down after resume.\n");

	return 0;
}
#endif

static const struct dev_pm_ops imx6_pcie_pm_ops = {
	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(imx6_pcie_suspend_noirq,
				      imx6_pcie_resume_noirq)
};

1015
static int imx6_pcie_probe(struct platform_device *pdev)
1016
{
1017
	struct device *dev = &pdev->dev;
1018
	struct dw_pcie *pci;
1019
	struct imx6_pcie *imx6_pcie;
1020
	struct device_node *np;
1021
	struct resource *dbi_base;
1022
	struct device_node *node = dev->of_node;
1023
	int ret;
1024
	u16 val;
1025

1026
	imx6_pcie = devm_kzalloc(dev, sizeof(*imx6_pcie), GFP_KERNEL);
1027 1028 1029
	if (!imx6_pcie)
		return -ENOMEM;

1030 1031 1032 1033 1034 1035
	pci = devm_kzalloc(dev, sizeof(*pci), GFP_KERNEL);
	if (!pci)
		return -ENOMEM;

	pci->dev = dev;
	pci->ops = &dw_pcie_ops;
1036

1037
	imx6_pcie->pci = pci;
A
Andrey Smirnov 已提交
1038
	imx6_pcie->drvdata = of_device_get_match_data(dev);
1039

1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055
	/* Find the PHY if one is defined, only imx7d uses it */
	np = of_parse_phandle(node, "fsl,imx7d-pcie-phy", 0);
	if (np) {
		struct resource res;

		ret = of_address_to_resource(np, 0, &res);
		if (ret) {
			dev_err(dev, "Unable to map PCIe PHY\n");
			return ret;
		}
		imx6_pcie->phy_base = devm_ioremap_resource(dev, &res);
		if (IS_ERR(imx6_pcie->phy_base)) {
			dev_err(dev, "Unable to map PCIe PHY\n");
			return PTR_ERR(imx6_pcie->phy_base);
		}
	}
1056

1057
	dbi_base = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1058 1059 1060
	pci->dbi_base = devm_ioremap_resource(dev, dbi_base);
	if (IS_ERR(pci->dbi_base))
		return PTR_ERR(pci->dbi_base);
1061 1062

	/* Fetch GPIOs */
1063 1064
	imx6_pcie->reset_gpio = of_get_named_gpio(node, "reset-gpio", 0);
	imx6_pcie->gpio_active_high = of_property_read_bool(node,
1065
						"reset-gpio-active-high");
1066
	if (gpio_is_valid(imx6_pcie->reset_gpio)) {
1067
		ret = devm_gpio_request_one(dev, imx6_pcie->reset_gpio,
1068 1069 1070 1071
				imx6_pcie->gpio_active_high ?
					GPIOF_OUT_INIT_HIGH :
					GPIOF_OUT_INIT_LOW,
				"PCIe reset");
1072
		if (ret) {
1073
			dev_err(dev, "unable to get reset gpio\n");
1074 1075
			return ret;
		}
1076 1077
	} else if (imx6_pcie->reset_gpio == -EPROBE_DEFER) {
		return imx6_pcie->reset_gpio;
1078
	}
1079 1080

	/* Fetch clocks */
1081
	imx6_pcie->pcie_phy = devm_clk_get(dev, "pcie_phy");
L
Lucas Stach 已提交
1082
	if (IS_ERR(imx6_pcie->pcie_phy)) {
1083
		dev_err(dev, "pcie_phy clock source missing or invalid\n");
L
Lucas Stach 已提交
1084
		return PTR_ERR(imx6_pcie->pcie_phy);
1085 1086
	}

1087
	imx6_pcie->pcie_bus = devm_clk_get(dev, "pcie_bus");
L
Lucas Stach 已提交
1088
	if (IS_ERR(imx6_pcie->pcie_bus)) {
1089
		dev_err(dev, "pcie_bus clock source missing or invalid\n");
L
Lucas Stach 已提交
1090
		return PTR_ERR(imx6_pcie->pcie_bus);
1091 1092
	}

1093
	imx6_pcie->pcie = devm_clk_get(dev, "pcie");
L
Lucas Stach 已提交
1094
	if (IS_ERR(imx6_pcie->pcie)) {
1095
		dev_err(dev, "pcie clock source missing or invalid\n");
L
Lucas Stach 已提交
1096
		return PTR_ERR(imx6_pcie->pcie);
1097 1098
	}

A
Andrey Smirnov 已提交
1099
	switch (imx6_pcie->drvdata->variant) {
1100
	case IMX6SX:
1101
		imx6_pcie->pcie_inbound_axi = devm_clk_get(dev,
1102 1103
							   "pcie_inbound_axi");
		if (IS_ERR(imx6_pcie->pcie_inbound_axi)) {
1104
			dev_err(dev, "pcie_inbound_axi clock missing or invalid\n");
1105 1106
			return PTR_ERR(imx6_pcie->pcie_inbound_axi);
		}
1107
		break;
1108
	case IMX8MQ:
1109 1110 1111 1112 1113 1114
		imx6_pcie->pcie_aux = devm_clk_get(dev, "pcie_aux");
		if (IS_ERR(imx6_pcie->pcie_aux)) {
			dev_err(dev, "pcie_aux clock source missing or invalid\n");
			return PTR_ERR(imx6_pcie->pcie_aux);
		}
		/* fall through */
1115
	case IMX7D:
1116 1117 1118
		if (dbi_base->start == IMX8MQ_PCIE2_BASE_ADDR)
			imx6_pcie->controller_id = 1;

1119 1120
		imx6_pcie->pciephy_reset = devm_reset_control_get_exclusive(dev,
									    "pciephy");
1121
		if (IS_ERR(imx6_pcie->pciephy_reset)) {
1122
			dev_err(dev, "Failed to get PCIEPHY reset control\n");
1123 1124 1125
			return PTR_ERR(imx6_pcie->pciephy_reset);
		}

1126 1127
		imx6_pcie->apps_reset = devm_reset_control_get_exclusive(dev,
									 "apps");
1128
		if (IS_ERR(imx6_pcie->apps_reset)) {
1129
			dev_err(dev, "Failed to get PCIE APPS reset control\n");
1130 1131 1132 1133 1134
			return PTR_ERR(imx6_pcie->apps_reset);
		}
		break;
	default:
		break;
1135 1136
	}

1137 1138 1139 1140 1141 1142 1143
	/* Grab turnoff reset */
	imx6_pcie->turnoff_reset = devm_reset_control_get_optional_exclusive(dev, "turnoff");
	if (IS_ERR(imx6_pcie->turnoff_reset)) {
		dev_err(dev, "Failed to get TURNOFF reset control\n");
		return PTR_ERR(imx6_pcie->turnoff_reset);
	}

1144 1145 1146 1147
	/* Grab GPR config register range */
	imx6_pcie->iomuxc_gpr =
		 syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
	if (IS_ERR(imx6_pcie->iomuxc_gpr)) {
1148
		dev_err(dev, "unable to find iomuxc registers\n");
1149
		return PTR_ERR(imx6_pcie->iomuxc_gpr);
1150
	}
1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171

	/* Grab PCIe PHY Tx Settings */
	if (of_property_read_u32(node, "fsl,tx-deemph-gen1",
				 &imx6_pcie->tx_deemph_gen1))
		imx6_pcie->tx_deemph_gen1 = 0;

	if (of_property_read_u32(node, "fsl,tx-deemph-gen2-3p5db",
				 &imx6_pcie->tx_deemph_gen2_3p5db))
		imx6_pcie->tx_deemph_gen2_3p5db = 0;

	if (of_property_read_u32(node, "fsl,tx-deemph-gen2-6db",
				 &imx6_pcie->tx_deemph_gen2_6db))
		imx6_pcie->tx_deemph_gen2_6db = 20;

	if (of_property_read_u32(node, "fsl,tx-swing-full",
				 &imx6_pcie->tx_swing_full))
		imx6_pcie->tx_swing_full = 127;

	if (of_property_read_u32(node, "fsl,tx-swing-low",
				 &imx6_pcie->tx_swing_low))
		imx6_pcie->tx_swing_low = 127;
1172

1173
	/* Limit link speed */
1174
	ret = of_property_read_u32(node, "fsl,max-link-speed",
1175 1176 1177 1178
				   &imx6_pcie->link_gen);
	if (ret)
		imx6_pcie->link_gen = 1;

1179 1180 1181 1182 1183 1184 1185
	imx6_pcie->vpcie = devm_regulator_get_optional(&pdev->dev, "vpcie");
	if (IS_ERR(imx6_pcie->vpcie)) {
		if (PTR_ERR(imx6_pcie->vpcie) == -EPROBE_DEFER)
			return -EPROBE_DEFER;
		imx6_pcie->vpcie = NULL;
	}

1186 1187
	platform_set_drvdata(pdev, imx6_pcie);

L
Leonard Crestez 已提交
1188 1189 1190 1191
	ret = imx6_pcie_attach_pd(dev);
	if (ret)
		return ret;

1192
	ret = imx6_add_pcie_port(imx6_pcie, pdev);
1193
	if (ret < 0)
1194
		return ret;
1195

1196 1197 1198 1199 1200 1201 1202 1203
	if (pci_msi_enabled()) {
		val = dw_pcie_readw_dbi(pci, PCIE_RC_IMX6_MSI_CAP +
					PCI_MSI_FLAGS);
		val |= PCI_MSI_FLAGS_ENABLE;
		dw_pcie_writew_dbi(pci, PCIE_RC_IMX6_MSI_CAP + PCI_MSI_FLAGS,
				   val);
	}

1204 1205 1206
	return 0;
}

1207 1208 1209 1210 1211
static void imx6_pcie_shutdown(struct platform_device *pdev)
{
	struct imx6_pcie *imx6_pcie = platform_get_drvdata(pdev);

	/* bring down link, so bootloader gets clean state in case of reboot */
1212
	imx6_pcie_assert_core_reset(imx6_pcie);
1213 1214
}

A
Andrey Smirnov 已提交
1215 1216 1217
static const struct imx6_pcie_drvdata drvdata[] = {
	[IMX6Q] = {
		.variant = IMX6Q,
1218 1219
		.flags = IMX6_PCIE_FLAG_IMX6_PHY |
			 IMX6_PCIE_FLAG_IMX6_SPEED_CHANGE,
A
Andrey Smirnov 已提交
1220 1221 1222
	},
	[IMX6SX] = {
		.variant = IMX6SX,
1223 1224
		.flags = IMX6_PCIE_FLAG_IMX6_PHY |
			 IMX6_PCIE_FLAG_IMX6_SPEED_CHANGE,
A
Andrey Smirnov 已提交
1225 1226 1227
	},
	[IMX6QP] = {
		.variant = IMX6QP,
1228 1229
		.flags = IMX6_PCIE_FLAG_IMX6_PHY |
			 IMX6_PCIE_FLAG_IMX6_SPEED_CHANGE,
A
Andrey Smirnov 已提交
1230 1231 1232 1233
	},
	[IMX7D] = {
		.variant = IMX7D,
	},
1234 1235 1236
	[IMX8MQ] = {
		.variant = IMX8MQ,
	},
A
Andrey Smirnov 已提交
1237 1238
};

1239
static const struct of_device_id imx6_pcie_of_match[] = {
A
Andrey Smirnov 已提交
1240 1241 1242 1243
	{ .compatible = "fsl,imx6q-pcie",  .data = &drvdata[IMX6Q],  },
	{ .compatible = "fsl,imx6sx-pcie", .data = &drvdata[IMX6SX], },
	{ .compatible = "fsl,imx6qp-pcie", .data = &drvdata[IMX6QP], },
	{ .compatible = "fsl,imx7d-pcie",  .data = &drvdata[IMX7D],  },
1244
	{ .compatible = "fsl,imx8mq-pcie", .data = &drvdata[IMX8MQ], } ,
1245 1246 1247 1248 1249 1250
	{},
};

static struct platform_driver imx6_pcie_driver = {
	.driver = {
		.name	= "imx6q-pcie",
1251
		.of_match_table = imx6_pcie_of_match,
1252
		.suppress_bind_attrs = true,
1253
		.pm = &imx6_pcie_pm_ops,
1254
	},
1255
	.probe    = imx6_pcie_probe,
1256
	.shutdown = imx6_pcie_shutdown,
1257 1258 1259 1260
};

static int __init imx6_pcie_init(void)
{
1261
#ifdef CONFIG_ARM
1262 1263 1264 1265 1266 1267 1268
	/*
	 * Since probe() can be deferred we need to make sure that
	 * hook_fault_code is not called after __init memory is freed
	 * by kernel and since imx6q_pcie_abort_handler() is a no-op,
	 * we can install the handler here without risking it
	 * accessing some uninitialized driver state.
	 */
1269 1270
	hook_fault_code(8, imx6q_pcie_abort_handler, SIGBUS, 0,
			"external abort on non-linefetch");
1271
#endif
1272 1273

	return platform_driver_register(&imx6_pcie_driver);
1274
}
1275
device_initcall(imx6_pcie_init);