8a6a8d573e2b02d7e6358ebb5c9aec855f50ec05
[cascardo/linux.git] / drivers / pci / host / pci-imx6.c
1 /*
2  * PCIe host controller driver for Freescale i.MX6 SoCs
3  *
4  * Copyright (C) 2013 Kosagi
5  *              http://www.kosagi.com
6  *
7  * Author: Sean Cross <xobs@kosagi.com>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 as
11  * published by the Free Software Foundation.
12  */
13
14 #include <linux/clk.h>
15 #include <linux/delay.h>
16 #include <linux/gpio.h>
17 #include <linux/kernel.h>
18 #include <linux/mfd/syscon.h>
19 #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
20 #include <linux/module.h>
21 #include <linux/of_gpio.h>
22 #include <linux/of_device.h>
23 #include <linux/pci.h>
24 #include <linux/platform_device.h>
25 #include <linux/regmap.h>
26 #include <linux/resource.h>
27 #include <linux/signal.h>
28 #include <linux/types.h>
29 #include <linux/interrupt.h>
30
31 #include "pcie-designware.h"
32
33 #define to_imx6_pcie(x) container_of(x, struct imx6_pcie, pp)
34
35 enum imx6_pcie_variants {
36         IMX6Q,
37         IMX6SX,
38         IMX6QP,
39 };
40
41 struct imx6_pcie {
42         int                     reset_gpio;
43         bool                    gpio_active_high;
44         struct clk              *pcie_bus;
45         struct clk              *pcie_phy;
46         struct clk              *pcie_inbound_axi;
47         struct clk              *pcie;
48         struct pcie_port        pp;
49         struct regmap           *iomuxc_gpr;
50         enum imx6_pcie_variants variant;
51         u32                     tx_deemph_gen1;
52         u32                     tx_deemph_gen2_3p5db;
53         u32                     tx_deemph_gen2_6db;
54         u32                     tx_swing_full;
55         u32                     tx_swing_low;
56         int                     link_gen;
57 };
58
59 /* PCIe Root Complex registers (memory-mapped) */
60 #define PCIE_RC_LCR                             0x7c
61 #define PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN1        0x1
62 #define PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN2        0x2
63 #define PCIE_RC_LCR_MAX_LINK_SPEEDS_MASK        0xf
64
65 #define PCIE_RC_LCSR                            0x80
66
67 /* PCIe Port Logic registers (memory-mapped) */
68 #define PL_OFFSET 0x700
69 #define PCIE_PL_PFLR (PL_OFFSET + 0x08)
70 #define PCIE_PL_PFLR_LINK_STATE_MASK            (0x3f << 16)
71 #define PCIE_PL_PFLR_FORCE_LINK                 (1 << 15)
72 #define PCIE_PHY_DEBUG_R0 (PL_OFFSET + 0x28)
73 #define PCIE_PHY_DEBUG_R1 (PL_OFFSET + 0x2c)
74 #define PCIE_PHY_DEBUG_R1_XMLH_LINK_IN_TRAINING (1 << 29)
75 #define PCIE_PHY_DEBUG_R1_XMLH_LINK_UP          (1 << 4)
76
77 #define PCIE_PHY_CTRL (PL_OFFSET + 0x114)
78 #define PCIE_PHY_CTRL_DATA_LOC 0
79 #define PCIE_PHY_CTRL_CAP_ADR_LOC 16
80 #define PCIE_PHY_CTRL_CAP_DAT_LOC 17
81 #define PCIE_PHY_CTRL_WR_LOC 18
82 #define PCIE_PHY_CTRL_RD_LOC 19
83
84 #define PCIE_PHY_STAT (PL_OFFSET + 0x110)
85 #define PCIE_PHY_STAT_ACK_LOC 16
86
87 #define PCIE_LINK_WIDTH_SPEED_CONTROL   0x80C
88 #define PORT_LOGIC_SPEED_CHANGE         (0x1 << 17)
89
90 /* PHY registers (not memory-mapped) */
91 #define PCIE_PHY_RX_ASIC_OUT 0x100D
92 #define PCIE_PHY_RX_ASIC_OUT_VALID      (1 << 0)
93
94 #define PHY_RX_OVRD_IN_LO 0x1005
95 #define PHY_RX_OVRD_IN_LO_RX_DATA_EN (1 << 5)
96 #define PHY_RX_OVRD_IN_LO_RX_PLL_EN (1 << 3)
97
98 static int pcie_phy_poll_ack(struct imx6_pcie *imx6_pcie, int exp_val)
99 {
100         void __iomem *dbi_base = imx6_pcie->pp.dbi_base;
101         u32 val;
102         u32 max_iterations = 10;
103         u32 wait_counter = 0;
104
105         do {
106                 val = readl(dbi_base + PCIE_PHY_STAT);
107                 val = (val >> PCIE_PHY_STAT_ACK_LOC) & 0x1;
108                 wait_counter++;
109
110                 if (val == exp_val)
111                         return 0;
112
113                 udelay(1);
114         } while (wait_counter < max_iterations);
115
116         return -ETIMEDOUT;
117 }
118
119 static int pcie_phy_wait_ack(struct imx6_pcie *imx6_pcie, int addr)
120 {
121         void __iomem *dbi_base = imx6_pcie->pp.dbi_base;
122         u32 val;
123         int ret;
124
125         val = addr << PCIE_PHY_CTRL_DATA_LOC;
126         writel(val, dbi_base + PCIE_PHY_CTRL);
127
128         val |= (0x1 << PCIE_PHY_CTRL_CAP_ADR_LOC);
129         writel(val, dbi_base + PCIE_PHY_CTRL);
130
131         ret = pcie_phy_poll_ack(imx6_pcie, 1);
132         if (ret)
133                 return ret;
134
135         val = addr << PCIE_PHY_CTRL_DATA_LOC;
136         writel(val, dbi_base + PCIE_PHY_CTRL);
137
138         return pcie_phy_poll_ack(imx6_pcie, 0);
139 }
140
141 /* Read from the 16-bit PCIe PHY control registers (not memory-mapped) */
142 static int pcie_phy_read(struct imx6_pcie *imx6_pcie, int addr, int *data)
143 {
144         void __iomem *dbi_base = imx6_pcie->pp.dbi_base;
145         u32 val, phy_ctl;
146         int ret;
147
148         ret = pcie_phy_wait_ack(imx6_pcie, addr);
149         if (ret)
150                 return ret;
151
152         /* assert Read signal */
153         phy_ctl = 0x1 << PCIE_PHY_CTRL_RD_LOC;
154         writel(phy_ctl, dbi_base + PCIE_PHY_CTRL);
155
156         ret = pcie_phy_poll_ack(imx6_pcie, 1);
157         if (ret)
158                 return ret;
159
160         val = readl(dbi_base + PCIE_PHY_STAT);
161         *data = val & 0xffff;
162
163         /* deassert Read signal */
164         writel(0x00, dbi_base + PCIE_PHY_CTRL);
165
166         return pcie_phy_poll_ack(imx6_pcie, 0);
167 }
168
169 static int pcie_phy_write(struct imx6_pcie *imx6_pcie, int addr, int data)
170 {
171         void __iomem *dbi_base = imx6_pcie->pp.dbi_base;
172         u32 var;
173         int ret;
174
175         /* write addr */
176         /* cap addr */
177         ret = pcie_phy_wait_ack(imx6_pcie, addr);
178         if (ret)
179                 return ret;
180
181         var = data << PCIE_PHY_CTRL_DATA_LOC;
182         writel(var, dbi_base + PCIE_PHY_CTRL);
183
184         /* capture data */
185         var |= (0x1 << PCIE_PHY_CTRL_CAP_DAT_LOC);
186         writel(var, dbi_base + PCIE_PHY_CTRL);
187
188         ret = pcie_phy_poll_ack(imx6_pcie, 1);
189         if (ret)
190                 return ret;
191
192         /* deassert cap data */
193         var = data << PCIE_PHY_CTRL_DATA_LOC;
194         writel(var, dbi_base + PCIE_PHY_CTRL);
195
196         /* wait for ack de-assertion */
197         ret = pcie_phy_poll_ack(imx6_pcie, 0);
198         if (ret)
199                 return ret;
200
201         /* assert wr signal */
202         var = 0x1 << PCIE_PHY_CTRL_WR_LOC;
203         writel(var, dbi_base + PCIE_PHY_CTRL);
204
205         /* wait for ack */
206         ret = pcie_phy_poll_ack(imx6_pcie, 1);
207         if (ret)
208                 return ret;
209
210         /* deassert wr signal */
211         var = data << PCIE_PHY_CTRL_DATA_LOC;
212         writel(var, dbi_base + PCIE_PHY_CTRL);
213
214         /* wait for ack de-assertion */
215         ret = pcie_phy_poll_ack(imx6_pcie, 0);
216         if (ret)
217                 return ret;
218
219         writel(0x0, dbi_base + PCIE_PHY_CTRL);
220
221         return 0;
222 }
223
224 static void imx6_pcie_reset_phy(struct pcie_port *pp)
225 {
226         struct imx6_pcie *imx6_pcie = to_imx6_pcie(pp);
227         u32 tmp;
228
229         pcie_phy_read(imx6_pcie, PHY_RX_OVRD_IN_LO, &tmp);
230         tmp |= (PHY_RX_OVRD_IN_LO_RX_DATA_EN |
231                 PHY_RX_OVRD_IN_LO_RX_PLL_EN);
232         pcie_phy_write(imx6_pcie, PHY_RX_OVRD_IN_LO, tmp);
233
234         usleep_range(2000, 3000);
235
236         pcie_phy_read(imx6_pcie, PHY_RX_OVRD_IN_LO, &tmp);
237         tmp &= ~(PHY_RX_OVRD_IN_LO_RX_DATA_EN |
238                   PHY_RX_OVRD_IN_LO_RX_PLL_EN);
239         pcie_phy_write(imx6_pcie, PHY_RX_OVRD_IN_LO, tmp);
240 }
241
242 /*  Added for PCI abort handling */
243 static int imx6q_pcie_abort_handler(unsigned long addr,
244                 unsigned int fsr, struct pt_regs *regs)
245 {
246         return 0;
247 }
248
249 static int imx6_pcie_assert_core_reset(struct pcie_port *pp)
250 {
251         struct imx6_pcie *imx6_pcie = to_imx6_pcie(pp);
252         u32 val, gpr1, gpr12;
253
254         switch (imx6_pcie->variant) {
255         case IMX6SX:
256                 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
257                                    IMX6SX_GPR12_PCIE_TEST_POWERDOWN,
258                                    IMX6SX_GPR12_PCIE_TEST_POWERDOWN);
259                 /* Force PCIe PHY reset */
260                 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5,
261                                    IMX6SX_GPR5_PCIE_BTNRST_RESET,
262                                    IMX6SX_GPR5_PCIE_BTNRST_RESET);
263                 break;
264         case IMX6QP:
265                 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
266                                    IMX6Q_GPR1_PCIE_SW_RST,
267                                    IMX6Q_GPR1_PCIE_SW_RST);
268                 break;
269         case IMX6Q:
270                 /*
271                  * If the bootloader already enabled the link we need some
272                  * special handling to get the core back into a state where
273                  * it is safe to touch it for configuration.  As there is
274                  * no dedicated reset signal wired up for MX6QDL, we need
275                  * to manually force LTSSM into "detect" state before
276                  * completely disabling LTSSM, which is a prerequisite for
277                  * core configuration.
278                  *
279                  * If both LTSSM_ENABLE and REF_SSP_ENABLE are active we
280                  * have a strong indication that the bootloader activated
281                  * the link.
282                  */
283                 regmap_read(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1, &gpr1);
284                 regmap_read(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, &gpr12);
285
286                 if ((gpr1 & IMX6Q_GPR1_PCIE_REF_CLK_EN) &&
287                     (gpr12 & IMX6Q_GPR12_PCIE_CTL_2)) {
288                         val = readl(pp->dbi_base + PCIE_PL_PFLR);
289                         val &= ~PCIE_PL_PFLR_LINK_STATE_MASK;
290                         val |= PCIE_PL_PFLR_FORCE_LINK;
291                         writel(val, pp->dbi_base + PCIE_PL_PFLR);
292
293                         regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
294                                            IMX6Q_GPR12_PCIE_CTL_2, 0 << 10);
295                 }
296
297                 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
298                                    IMX6Q_GPR1_PCIE_TEST_PD, 1 << 18);
299                 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
300                                    IMX6Q_GPR1_PCIE_REF_CLK_EN, 0 << 16);
301                 break;
302         }
303
304         return 0;
305 }
306
307 static int imx6_pcie_enable_ref_clk(struct imx6_pcie *imx6_pcie)
308 {
309         struct pcie_port *pp = &imx6_pcie->pp;
310         struct device *dev = pp->dev;
311         int ret = 0;
312
313         switch (imx6_pcie->variant) {
314         case IMX6SX:
315                 ret = clk_prepare_enable(imx6_pcie->pcie_inbound_axi);
316                 if (ret) {
317                         dev_err(dev, "unable to enable pcie_axi clock\n");
318                         break;
319                 }
320
321                 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
322                                    IMX6SX_GPR12_PCIE_TEST_POWERDOWN, 0);
323                 break;
324         case IMX6QP:            /* FALLTHROUGH */
325         case IMX6Q:
326                 /* power up core phy and enable ref clock */
327                 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
328                                    IMX6Q_GPR1_PCIE_TEST_PD, 0 << 18);
329                 /*
330                  * the async reset input need ref clock to sync internally,
331                  * when the ref clock comes after reset, internal synced
332                  * reset time is too short, cannot meet the requirement.
333                  * add one ~10us delay here.
334                  */
335                 udelay(10);
336                 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
337                                    IMX6Q_GPR1_PCIE_REF_CLK_EN, 1 << 16);
338                 break;
339         }
340
341         return ret;
342 }
343
344 static int imx6_pcie_deassert_core_reset(struct pcie_port *pp)
345 {
346         struct imx6_pcie *imx6_pcie = to_imx6_pcie(pp);
347         struct device *dev = pp->dev;
348         int ret;
349
350         ret = clk_prepare_enable(imx6_pcie->pcie_phy);
351         if (ret) {
352                 dev_err(dev, "unable to enable pcie_phy clock\n");
353                 goto err_pcie_phy;
354         }
355
356         ret = clk_prepare_enable(imx6_pcie->pcie_bus);
357         if (ret) {
358                 dev_err(dev, "unable to enable pcie_bus clock\n");
359                 goto err_pcie_bus;
360         }
361
362         ret = clk_prepare_enable(imx6_pcie->pcie);
363         if (ret) {
364                 dev_err(dev, "unable to enable pcie clock\n");
365                 goto err_pcie;
366         }
367
368         ret = imx6_pcie_enable_ref_clk(imx6_pcie);
369         if (ret) {
370                 dev_err(dev, "unable to enable pcie ref clock\n");
371                 goto err_ref_clk;
372         }
373
374         /* allow the clocks to stabilize */
375         usleep_range(200, 500);
376
377         /* Some boards don't have PCIe reset GPIO. */
378         if (gpio_is_valid(imx6_pcie->reset_gpio)) {
379                 gpio_set_value_cansleep(imx6_pcie->reset_gpio,
380                                         imx6_pcie->gpio_active_high);
381                 msleep(100);
382                 gpio_set_value_cansleep(imx6_pcie->reset_gpio,
383                                         !imx6_pcie->gpio_active_high);
384         }
385
386         switch (imx6_pcie->variant) {
387         case IMX6SX:
388                 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5,
389                                    IMX6SX_GPR5_PCIE_BTNRST_RESET, 0);
390                 break;
391         case IMX6QP:
392                 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
393                                    IMX6Q_GPR1_PCIE_SW_RST, 0);
394
395                 usleep_range(200, 500);
396                 break;
397         case IMX6Q:             /* Nothing to do */
398                 break;
399         }
400
401         return 0;
402
403 err_ref_clk:
404         clk_disable_unprepare(imx6_pcie->pcie);
405 err_pcie:
406         clk_disable_unprepare(imx6_pcie->pcie_bus);
407 err_pcie_bus:
408         clk_disable_unprepare(imx6_pcie->pcie_phy);
409 err_pcie_phy:
410         return ret;
411 }
412
413 static void imx6_pcie_init_phy(struct pcie_port *pp)
414 {
415         struct imx6_pcie *imx6_pcie = to_imx6_pcie(pp);
416
417         if (imx6_pcie->variant == IMX6SX)
418                 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
419                                    IMX6SX_GPR12_PCIE_RX_EQ_MASK,
420                                    IMX6SX_GPR12_PCIE_RX_EQ_2);
421
422         regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
423                         IMX6Q_GPR12_PCIE_CTL_2, 0 << 10);
424
425         /* configure constant input signal to the pcie ctrl and phy */
426         regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
427                         IMX6Q_GPR12_DEVICE_TYPE, PCI_EXP_TYPE_ROOT_PORT << 12);
428         regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
429                         IMX6Q_GPR12_LOS_LEVEL, 9 << 4);
430
431         regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
432                            IMX6Q_GPR8_TX_DEEMPH_GEN1,
433                            imx6_pcie->tx_deemph_gen1 << 0);
434         regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
435                            IMX6Q_GPR8_TX_DEEMPH_GEN2_3P5DB,
436                            imx6_pcie->tx_deemph_gen2_3p5db << 6);
437         regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
438                            IMX6Q_GPR8_TX_DEEMPH_GEN2_6DB,
439                            imx6_pcie->tx_deemph_gen2_6db << 12);
440         regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
441                            IMX6Q_GPR8_TX_SWING_FULL,
442                            imx6_pcie->tx_swing_full << 18);
443         regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
444                            IMX6Q_GPR8_TX_SWING_LOW,
445                            imx6_pcie->tx_swing_low << 25);
446 }
447
448 static int imx6_pcie_wait_for_link(struct pcie_port *pp)
449 {
450         struct device *dev = pp->dev;
451
452         /* check if the link is up or not */
453         if (!dw_pcie_wait_for_link(pp))
454                 return 0;
455
456         dev_dbg(dev, "DEBUG_R0: 0x%08x, DEBUG_R1: 0x%08x\n",
457                 readl(pp->dbi_base + PCIE_PHY_DEBUG_R0),
458                 readl(pp->dbi_base + PCIE_PHY_DEBUG_R1));
459         return -ETIMEDOUT;
460 }
461
462 static int imx6_pcie_wait_for_speed_change(struct pcie_port *pp)
463 {
464         struct device *dev = pp->dev;
465         u32 tmp;
466         unsigned int retries;
467
468         for (retries = 0; retries < 200; retries++) {
469                 tmp = readl(pp->dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL);
470                 /* Test if the speed change finished. */
471                 if (!(tmp & PORT_LOGIC_SPEED_CHANGE))
472                         return 0;
473                 usleep_range(100, 1000);
474         }
475
476         dev_err(dev, "Speed change timeout\n");
477         return -EINVAL;
478 }
479
480 static irqreturn_t imx6_pcie_msi_handler(int irq, void *arg)
481 {
482         struct pcie_port *pp = arg;
483
484         return dw_handle_msi_irq(pp);
485 }
486
487 static int imx6_pcie_establish_link(struct pcie_port *pp)
488 {
489         struct imx6_pcie *imx6_pcie = to_imx6_pcie(pp);
490         struct device *dev = pp->dev;
491         u32 tmp;
492         int ret;
493
494         /*
495          * Force Gen1 operation when starting the link.  In case the link is
496          * started in Gen2 mode, there is a possibility the devices on the
497          * bus will not be detected at all.  This happens with PCIe switches.
498          */
499         tmp = readl(pp->dbi_base + PCIE_RC_LCR);
500         tmp &= ~PCIE_RC_LCR_MAX_LINK_SPEEDS_MASK;
501         tmp |= PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN1;
502         writel(tmp, pp->dbi_base + PCIE_RC_LCR);
503
504         /* Start LTSSM. */
505         regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
506                         IMX6Q_GPR12_PCIE_CTL_2, 1 << 10);
507
508         ret = imx6_pcie_wait_for_link(pp);
509         if (ret) {
510                 dev_info(dev, "Link never came up\n");
511                 goto err_reset_phy;
512         }
513
514         if (imx6_pcie->link_gen == 2) {
515                 /* Allow Gen2 mode after the link is up. */
516                 tmp = readl(pp->dbi_base + PCIE_RC_LCR);
517                 tmp &= ~PCIE_RC_LCR_MAX_LINK_SPEEDS_MASK;
518                 tmp |= PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN2;
519                 writel(tmp, pp->dbi_base + PCIE_RC_LCR);
520         } else {
521                 dev_info(dev, "Link: Gen2 disabled\n");
522         }
523
524         /*
525          * Start Directed Speed Change so the best possible speed both link
526          * partners support can be negotiated.
527          */
528         tmp = readl(pp->dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL);
529         tmp |= PORT_LOGIC_SPEED_CHANGE;
530         writel(tmp, pp->dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL);
531
532         ret = imx6_pcie_wait_for_speed_change(pp);
533         if (ret) {
534                 dev_err(dev, "Failed to bring link up!\n");
535                 goto err_reset_phy;
536         }
537
538         /* Make sure link training is finished as well! */
539         ret = imx6_pcie_wait_for_link(pp);
540         if (ret) {
541                 dev_err(dev, "Failed to bring link up!\n");
542                 goto err_reset_phy;
543         }
544
545         tmp = readl(pp->dbi_base + PCIE_RC_LCSR);
546         dev_info(dev, "Link up, Gen%i\n", (tmp >> 16) & 0xf);
547         return 0;
548
549 err_reset_phy:
550         dev_dbg(dev, "PHY DEBUG_R0=0x%08x DEBUG_R1=0x%08x\n",
551                 readl(pp->dbi_base + PCIE_PHY_DEBUG_R0),
552                 readl(pp->dbi_base + PCIE_PHY_DEBUG_R1));
553         imx6_pcie_reset_phy(pp);
554
555         return ret;
556 }
557
558 static void imx6_pcie_host_init(struct pcie_port *pp)
559 {
560         imx6_pcie_assert_core_reset(pp);
561
562         imx6_pcie_init_phy(pp);
563
564         imx6_pcie_deassert_core_reset(pp);
565
566         dw_pcie_setup_rc(pp);
567
568         imx6_pcie_establish_link(pp);
569
570         if (IS_ENABLED(CONFIG_PCI_MSI))
571                 dw_pcie_msi_init(pp);
572 }
573
574 static int imx6_pcie_link_up(struct pcie_port *pp)
575 {
576         return readl(pp->dbi_base + PCIE_PHY_DEBUG_R1) &
577                         PCIE_PHY_DEBUG_R1_XMLH_LINK_UP;
578 }
579
580 static struct pcie_host_ops imx6_pcie_host_ops = {
581         .link_up = imx6_pcie_link_up,
582         .host_init = imx6_pcie_host_init,
583 };
584
585 static int __init imx6_add_pcie_port(struct pcie_port *pp,
586                         struct platform_device *pdev)
587 {
588         struct device *dev = pp->dev;
589         int ret;
590
591         if (IS_ENABLED(CONFIG_PCI_MSI)) {
592                 pp->msi_irq = platform_get_irq_byname(pdev, "msi");
593                 if (pp->msi_irq <= 0) {
594                         dev_err(dev, "failed to get MSI irq\n");
595                         return -ENODEV;
596                 }
597
598                 ret = devm_request_irq(dev, pp->msi_irq,
599                                        imx6_pcie_msi_handler,
600                                        IRQF_SHARED | IRQF_NO_THREAD,
601                                        "mx6-pcie-msi", pp);
602                 if (ret) {
603                         dev_err(dev, "failed to request MSI irq\n");
604                         return ret;
605                 }
606         }
607
608         pp->root_bus_nr = -1;
609         pp->ops = &imx6_pcie_host_ops;
610
611         ret = dw_pcie_host_init(pp);
612         if (ret) {
613                 dev_err(dev, "failed to initialize host\n");
614                 return ret;
615         }
616
617         return 0;
618 }
619
620 static int __init imx6_pcie_probe(struct platform_device *pdev)
621 {
622         struct device *dev = &pdev->dev;
623         struct imx6_pcie *imx6_pcie;
624         struct pcie_port *pp;
625         struct resource *dbi_base;
626         struct device_node *node = dev->of_node;
627         int ret;
628
629         imx6_pcie = devm_kzalloc(dev, sizeof(*imx6_pcie), GFP_KERNEL);
630         if (!imx6_pcie)
631                 return -ENOMEM;
632
633         pp = &imx6_pcie->pp;
634         pp->dev = dev;
635
636         imx6_pcie->variant =
637                 (enum imx6_pcie_variants)of_device_get_match_data(dev);
638
639         /* Added for PCI abort handling */
640         hook_fault_code(16 + 6, imx6q_pcie_abort_handler, SIGBUS, 0,
641                 "imprecise external abort");
642
643         dbi_base = platform_get_resource(pdev, IORESOURCE_MEM, 0);
644         pp->dbi_base = devm_ioremap_resource(dev, dbi_base);
645         if (IS_ERR(pp->dbi_base))
646                 return PTR_ERR(pp->dbi_base);
647
648         /* Fetch GPIOs */
649         imx6_pcie->reset_gpio = of_get_named_gpio(node, "reset-gpio", 0);
650         imx6_pcie->gpio_active_high = of_property_read_bool(node,
651                                                 "reset-gpio-active-high");
652         if (gpio_is_valid(imx6_pcie->reset_gpio)) {
653                 ret = devm_gpio_request_one(dev, imx6_pcie->reset_gpio,
654                                 imx6_pcie->gpio_active_high ?
655                                         GPIOF_OUT_INIT_HIGH :
656                                         GPIOF_OUT_INIT_LOW,
657                                 "PCIe reset");
658                 if (ret) {
659                         dev_err(dev, "unable to get reset gpio\n");
660                         return ret;
661                 }
662         }
663
664         /* Fetch clocks */
665         imx6_pcie->pcie_phy = devm_clk_get(dev, "pcie_phy");
666         if (IS_ERR(imx6_pcie->pcie_phy)) {
667                 dev_err(dev, "pcie_phy clock source missing or invalid\n");
668                 return PTR_ERR(imx6_pcie->pcie_phy);
669         }
670
671         imx6_pcie->pcie_bus = devm_clk_get(dev, "pcie_bus");
672         if (IS_ERR(imx6_pcie->pcie_bus)) {
673                 dev_err(dev, "pcie_bus clock source missing or invalid\n");
674                 return PTR_ERR(imx6_pcie->pcie_bus);
675         }
676
677         imx6_pcie->pcie = devm_clk_get(dev, "pcie");
678         if (IS_ERR(imx6_pcie->pcie)) {
679                 dev_err(dev, "pcie clock source missing or invalid\n");
680                 return PTR_ERR(imx6_pcie->pcie);
681         }
682
683         if (imx6_pcie->variant == IMX6SX) {
684                 imx6_pcie->pcie_inbound_axi = devm_clk_get(dev,
685                                                            "pcie_inbound_axi");
686                 if (IS_ERR(imx6_pcie->pcie_inbound_axi)) {
687                         dev_err(dev,
688                                 "pcie_incbound_axi clock missing or invalid\n");
689                         return PTR_ERR(imx6_pcie->pcie_inbound_axi);
690                 }
691         }
692
693         /* Grab GPR config register range */
694         imx6_pcie->iomuxc_gpr =
695                  syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
696         if (IS_ERR(imx6_pcie->iomuxc_gpr)) {
697                 dev_err(dev, "unable to find iomuxc registers\n");
698                 return PTR_ERR(imx6_pcie->iomuxc_gpr);
699         }
700
701         /* Grab PCIe PHY Tx Settings */
702         if (of_property_read_u32(node, "fsl,tx-deemph-gen1",
703                                  &imx6_pcie->tx_deemph_gen1))
704                 imx6_pcie->tx_deemph_gen1 = 0;
705
706         if (of_property_read_u32(node, "fsl,tx-deemph-gen2-3p5db",
707                                  &imx6_pcie->tx_deemph_gen2_3p5db))
708                 imx6_pcie->tx_deemph_gen2_3p5db = 0;
709
710         if (of_property_read_u32(node, "fsl,tx-deemph-gen2-6db",
711                                  &imx6_pcie->tx_deemph_gen2_6db))
712                 imx6_pcie->tx_deemph_gen2_6db = 20;
713
714         if (of_property_read_u32(node, "fsl,tx-swing-full",
715                                  &imx6_pcie->tx_swing_full))
716                 imx6_pcie->tx_swing_full = 127;
717
718         if (of_property_read_u32(node, "fsl,tx-swing-low",
719                                  &imx6_pcie->tx_swing_low))
720                 imx6_pcie->tx_swing_low = 127;
721
722         /* Limit link speed */
723         ret = of_property_read_u32(node, "fsl,max-link-speed",
724                                    &imx6_pcie->link_gen);
725         if (ret)
726                 imx6_pcie->link_gen = 1;
727
728         ret = imx6_add_pcie_port(pp, pdev);
729         if (ret < 0)
730                 return ret;
731
732         platform_set_drvdata(pdev, imx6_pcie);
733         return 0;
734 }
735
736 static void imx6_pcie_shutdown(struct platform_device *pdev)
737 {
738         struct imx6_pcie *imx6_pcie = platform_get_drvdata(pdev);
739
740         /* bring down link, so bootloader gets clean state in case of reboot */
741         imx6_pcie_assert_core_reset(&imx6_pcie->pp);
742 }
743
744 static const struct of_device_id imx6_pcie_of_match[] = {
745         { .compatible = "fsl,imx6q-pcie",  .data = (void *)IMX6Q,  },
746         { .compatible = "fsl,imx6sx-pcie", .data = (void *)IMX6SX, },
747         { .compatible = "fsl,imx6qp-pcie", .data = (void *)IMX6QP, },
748         {},
749 };
750
751 static struct platform_driver imx6_pcie_driver = {
752         .driver = {
753                 .name   = "imx6q-pcie",
754                 .of_match_table = imx6_pcie_of_match,
755         },
756         .shutdown = imx6_pcie_shutdown,
757 };
758
759 static int __init imx6_pcie_init(void)
760 {
761         return platform_driver_probe(&imx6_pcie_driver, imx6_pcie_probe);
762 }
763 device_initcall(imx6_pcie_init);