1 // SPDX-License-Identifier: GPL-2.0
3 * PCIe host controller driver for Kirin Phone SoCs
5 * Copyright (C) 2017 Hilisicon Electronics Co., Ltd.
6 * http://www.huawei.com
8 * Author: Xiaowei Song <songxiaowei@huawei.com>
11 #include <asm/compiler.h>
12 #include <linux/compiler.h>
13 #include <linux/clk.h>
14 #include <linux/delay.h>
15 #include <linux/err.h>
16 #include <linux/gpio.h>
17 #include <linux/interrupt.h>
18 #include <linux/mfd/syscon.h>
19 #include <linux/of_address.h>
20 #include <linux/of_gpio.h>
21 #include <linux/of_pci.h>
22 #include <linux/pci.h>
23 #include <linux/pci_regs.h>
24 #include <linux/platform_device.h>
25 #include <linux/regmap.h>
26 #include <linux/resource.h>
27 #include <linux/types.h>
28 #include "pcie-designware.h"
30 #define to_kirin_pcie(x) dev_get_drvdata((x)->dev)
32 #define REF_CLK_FREQ 100000000
34 /* PCIe ELBI registers */
35 #define SOC_PCIECTRL_CTRL0_ADDR 0x000
36 #define SOC_PCIECTRL_CTRL1_ADDR 0x004
37 #define SOC_PCIEPHY_CTRL2_ADDR 0x008
38 #define SOC_PCIEPHY_CTRL3_ADDR 0x00c
39 #define PCIE_ELBI_SLV_DBI_ENABLE (0x1 << 21)
41 /* info located in APB */
42 #define PCIE_APP_LTSSM_ENABLE 0x01c
43 #define PCIE_APB_PHY_CTRL0 0x0
44 #define PCIE_APB_PHY_CTRL1 0x4
45 #define PCIE_APB_PHY_STATUS0 0x400
46 #define PCIE_LINKUP_ENABLE (0x8020)
47 #define PCIE_LTSSM_ENABLE_BIT (0x1 << 11)
48 #define PIPE_CLK_STABLE (0x1 << 19)
49 #define PHY_REF_PAD_BIT (0x1 << 8)
50 #define PHY_PWR_DOWN_BIT (0x1 << 22)
51 #define PHY_RST_ACK_BIT (0x1 << 16)
53 /* info located in sysctrl */
54 #define SCTRL_PCIE_CMOS_OFFSET 0x60
55 #define SCTRL_PCIE_CMOS_BIT 0x10
56 #define SCTRL_PCIE_ISO_OFFSET 0x44
57 #define SCTRL_PCIE_ISO_BIT 0x30
58 #define SCTRL_PCIE_HPCLK_OFFSET 0x190
59 #define SCTRL_PCIE_HPCLK_BIT 0x184000
60 #define SCTRL_PCIE_OE_OFFSET 0x14a
61 #define PCIE_DEBOUNCE_PARAM 0xF0F400
62 #define PCIE_OE_BYPASS (0x3 << 28)
65 #define CRGCTRL_PCIE_ASSERT_OFFSET 0x88
66 #define CRGCTRL_PCIE_ASSERT_BIT 0x8c000000
69 #define REF_2_PERST_MIN 20000
70 #define REF_2_PERST_MAX 25000
71 #define PERST_2_ACCESS_MIN 10000
72 #define PERST_2_ACCESS_MAX 12000
73 #define LINK_WAIT_MIN 900
74 #define LINK_WAIT_MAX 1000
75 #define PIPE_CLK_WAIT_MIN 550
76 #define PIPE_CLK_WAIT_MAX 600
77 #define TIME_CMOS_MIN 100
78 #define TIME_CMOS_MAX 105
79 #define TIME_PHY_PD_MIN 10
80 #define TIME_PHY_PD_MAX 11
84 void __iomem
*apb_base
;
85 void __iomem
*phy_base
;
86 struct regmap
*crgctrl
;
87 struct regmap
*sysctrl
;
88 struct clk
*apb_sys_clk
;
89 struct clk
*apb_phy_clk
;
90 struct clk
*phy_ref_clk
;
91 struct clk
*pcie_aclk
;
92 struct clk
*pcie_aux_clk
;
96 /* Registers in PCIeCTRL */
97 static inline void kirin_apb_ctrl_writel(struct kirin_pcie
*kirin_pcie
,
100 writel(val
, kirin_pcie
->apb_base
+ reg
);
103 static inline u32
kirin_apb_ctrl_readl(struct kirin_pcie
*kirin_pcie
, u32 reg
)
105 return readl(kirin_pcie
->apb_base
+ reg
);
108 /* Registers in PCIePHY */
109 static inline void kirin_apb_phy_writel(struct kirin_pcie
*kirin_pcie
,
112 writel(val
, kirin_pcie
->phy_base
+ reg
);
115 static inline u32
kirin_apb_phy_readl(struct kirin_pcie
*kirin_pcie
, u32 reg
)
117 return readl(kirin_pcie
->phy_base
+ reg
);
120 static long kirin_pcie_get_clk(struct kirin_pcie
*kirin_pcie
,
121 struct platform_device
*pdev
)
123 struct device
*dev
= &pdev
->dev
;
125 kirin_pcie
->phy_ref_clk
= devm_clk_get(dev
, "pcie_phy_ref");
126 if (IS_ERR(kirin_pcie
->phy_ref_clk
))
127 return PTR_ERR(kirin_pcie
->phy_ref_clk
);
129 kirin_pcie
->pcie_aux_clk
= devm_clk_get(dev
, "pcie_aux");
130 if (IS_ERR(kirin_pcie
->pcie_aux_clk
))
131 return PTR_ERR(kirin_pcie
->pcie_aux_clk
);
133 kirin_pcie
->apb_phy_clk
= devm_clk_get(dev
, "pcie_apb_phy");
134 if (IS_ERR(kirin_pcie
->apb_phy_clk
))
135 return PTR_ERR(kirin_pcie
->apb_phy_clk
);
137 kirin_pcie
->apb_sys_clk
= devm_clk_get(dev
, "pcie_apb_sys");
138 if (IS_ERR(kirin_pcie
->apb_sys_clk
))
139 return PTR_ERR(kirin_pcie
->apb_sys_clk
);
141 kirin_pcie
->pcie_aclk
= devm_clk_get(dev
, "pcie_aclk");
142 if (IS_ERR(kirin_pcie
->pcie_aclk
))
143 return PTR_ERR(kirin_pcie
->pcie_aclk
);
148 static long kirin_pcie_get_resource(struct kirin_pcie
*kirin_pcie
,
149 struct platform_device
*pdev
)
151 struct device
*dev
= &pdev
->dev
;
152 struct resource
*apb
;
153 struct resource
*phy
;
154 struct resource
*dbi
;
156 apb
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
, "apb");
157 kirin_pcie
->apb_base
= devm_ioremap_resource(dev
, apb
);
158 if (IS_ERR(kirin_pcie
->apb_base
))
159 return PTR_ERR(kirin_pcie
->apb_base
);
161 phy
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
, "phy");
162 kirin_pcie
->phy_base
= devm_ioremap_resource(dev
, phy
);
163 if (IS_ERR(kirin_pcie
->phy_base
))
164 return PTR_ERR(kirin_pcie
->phy_base
);
166 dbi
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
, "dbi");
167 kirin_pcie
->pci
->dbi_base
= devm_ioremap_resource(dev
, dbi
);
168 if (IS_ERR(kirin_pcie
->pci
->dbi_base
))
169 return PTR_ERR(kirin_pcie
->pci
->dbi_base
);
171 kirin_pcie
->crgctrl
=
172 syscon_regmap_lookup_by_compatible("hisilicon,hi3660-crgctrl");
173 if (IS_ERR(kirin_pcie
->crgctrl
))
174 return PTR_ERR(kirin_pcie
->crgctrl
);
176 kirin_pcie
->sysctrl
=
177 syscon_regmap_lookup_by_compatible("hisilicon,hi3660-sctrl");
178 if (IS_ERR(kirin_pcie
->sysctrl
))
179 return PTR_ERR(kirin_pcie
->sysctrl
);
184 static int kirin_pcie_phy_init(struct kirin_pcie
*kirin_pcie
)
186 struct device
*dev
= kirin_pcie
->pci
->dev
;
189 reg_val
= kirin_apb_phy_readl(kirin_pcie
, PCIE_APB_PHY_CTRL1
);
190 reg_val
&= ~PHY_REF_PAD_BIT
;
191 kirin_apb_phy_writel(kirin_pcie
, reg_val
, PCIE_APB_PHY_CTRL1
);
193 reg_val
= kirin_apb_phy_readl(kirin_pcie
, PCIE_APB_PHY_CTRL0
);
194 reg_val
&= ~PHY_PWR_DOWN_BIT
;
195 kirin_apb_phy_writel(kirin_pcie
, reg_val
, PCIE_APB_PHY_CTRL0
);
196 usleep_range(TIME_PHY_PD_MIN
, TIME_PHY_PD_MAX
);
198 reg_val
= kirin_apb_phy_readl(kirin_pcie
, PCIE_APB_PHY_CTRL1
);
199 reg_val
&= ~PHY_RST_ACK_BIT
;
200 kirin_apb_phy_writel(kirin_pcie
, reg_val
, PCIE_APB_PHY_CTRL1
);
202 usleep_range(PIPE_CLK_WAIT_MIN
, PIPE_CLK_WAIT_MAX
);
203 reg_val
= kirin_apb_phy_readl(kirin_pcie
, PCIE_APB_PHY_STATUS0
);
204 if (reg_val
& PIPE_CLK_STABLE
) {
205 dev_err(dev
, "PIPE clk is not stable\n");
212 static void kirin_pcie_oe_enable(struct kirin_pcie
*kirin_pcie
)
216 regmap_read(kirin_pcie
->sysctrl
, SCTRL_PCIE_OE_OFFSET
, &val
);
217 val
|= PCIE_DEBOUNCE_PARAM
;
218 val
&= ~PCIE_OE_BYPASS
;
219 regmap_write(kirin_pcie
->sysctrl
, SCTRL_PCIE_OE_OFFSET
, val
);
222 static int kirin_pcie_clk_ctrl(struct kirin_pcie
*kirin_pcie
, bool enable
)
229 ret
= clk_set_rate(kirin_pcie
->phy_ref_clk
, REF_CLK_FREQ
);
233 ret
= clk_prepare_enable(kirin_pcie
->phy_ref_clk
);
237 ret
= clk_prepare_enable(kirin_pcie
->apb_sys_clk
);
241 ret
= clk_prepare_enable(kirin_pcie
->apb_phy_clk
);
245 ret
= clk_prepare_enable(kirin_pcie
->pcie_aclk
);
249 ret
= clk_prepare_enable(kirin_pcie
->pcie_aux_clk
);
256 clk_disable_unprepare(kirin_pcie
->pcie_aux_clk
);
258 clk_disable_unprepare(kirin_pcie
->pcie_aclk
);
260 clk_disable_unprepare(kirin_pcie
->apb_phy_clk
);
262 clk_disable_unprepare(kirin_pcie
->apb_sys_clk
);
264 clk_disable_unprepare(kirin_pcie
->phy_ref_clk
);
269 static int kirin_pcie_power_on(struct kirin_pcie
*kirin_pcie
)
273 /* Power supply for Host */
274 regmap_write(kirin_pcie
->sysctrl
,
275 SCTRL_PCIE_CMOS_OFFSET
, SCTRL_PCIE_CMOS_BIT
);
276 usleep_range(TIME_CMOS_MIN
, TIME_CMOS_MAX
);
277 kirin_pcie_oe_enable(kirin_pcie
);
279 ret
= kirin_pcie_clk_ctrl(kirin_pcie
, true);
283 /* ISO disable, PCIeCtrl, PHY assert and clk gate clear */
284 regmap_write(kirin_pcie
->sysctrl
,
285 SCTRL_PCIE_ISO_OFFSET
, SCTRL_PCIE_ISO_BIT
);
286 regmap_write(kirin_pcie
->crgctrl
,
287 CRGCTRL_PCIE_ASSERT_OFFSET
, CRGCTRL_PCIE_ASSERT_BIT
);
288 regmap_write(kirin_pcie
->sysctrl
,
289 SCTRL_PCIE_HPCLK_OFFSET
, SCTRL_PCIE_HPCLK_BIT
);
291 ret
= kirin_pcie_phy_init(kirin_pcie
);
295 /* perst assert Endpoint */
296 if (!gpio_request(kirin_pcie
->gpio_id_reset
, "pcie_perst")) {
297 usleep_range(REF_2_PERST_MIN
, REF_2_PERST_MAX
);
298 ret
= gpio_direction_output(kirin_pcie
->gpio_id_reset
, 1);
301 usleep_range(PERST_2_ACCESS_MIN
, PERST_2_ACCESS_MAX
);
307 kirin_pcie_clk_ctrl(kirin_pcie
, false);
311 static void kirin_pcie_sideband_dbi_w_mode(struct kirin_pcie
*kirin_pcie
,
316 val
= kirin_apb_ctrl_readl(kirin_pcie
, SOC_PCIECTRL_CTRL0_ADDR
);
318 val
= val
| PCIE_ELBI_SLV_DBI_ENABLE
;
320 val
= val
& ~PCIE_ELBI_SLV_DBI_ENABLE
;
322 kirin_apb_ctrl_writel(kirin_pcie
, val
, SOC_PCIECTRL_CTRL0_ADDR
);
325 static void kirin_pcie_sideband_dbi_r_mode(struct kirin_pcie
*kirin_pcie
,
330 val
= kirin_apb_ctrl_readl(kirin_pcie
, SOC_PCIECTRL_CTRL1_ADDR
);
332 val
= val
| PCIE_ELBI_SLV_DBI_ENABLE
;
334 val
= val
& ~PCIE_ELBI_SLV_DBI_ENABLE
;
336 kirin_apb_ctrl_writel(kirin_pcie
, val
, SOC_PCIECTRL_CTRL1_ADDR
);
339 static int kirin_pcie_rd_own_conf(struct pcie_port
*pp
,
340 int where
, int size
, u32
*val
)
342 struct dw_pcie
*pci
= to_dw_pcie_from_pp(pp
);
343 struct kirin_pcie
*kirin_pcie
= to_kirin_pcie(pci
);
346 kirin_pcie_sideband_dbi_r_mode(kirin_pcie
, true);
347 ret
= dw_pcie_read(pci
->dbi_base
+ where
, size
, val
);
348 kirin_pcie_sideband_dbi_r_mode(kirin_pcie
, false);
353 static int kirin_pcie_wr_own_conf(struct pcie_port
*pp
,
354 int where
, int size
, u32 val
)
356 struct dw_pcie
*pci
= to_dw_pcie_from_pp(pp
);
357 struct kirin_pcie
*kirin_pcie
= to_kirin_pcie(pci
);
360 kirin_pcie_sideband_dbi_w_mode(kirin_pcie
, true);
361 ret
= dw_pcie_write(pci
->dbi_base
+ where
, size
, val
);
362 kirin_pcie_sideband_dbi_w_mode(kirin_pcie
, false);
367 static u32
kirin_pcie_read_dbi(struct dw_pcie
*pci
, void __iomem
*base
,
368 u32 reg
, size_t size
)
370 struct kirin_pcie
*kirin_pcie
= to_kirin_pcie(pci
);
373 kirin_pcie_sideband_dbi_r_mode(kirin_pcie
, true);
374 dw_pcie_read(base
+ reg
, size
, &ret
);
375 kirin_pcie_sideband_dbi_r_mode(kirin_pcie
, false);
380 static void kirin_pcie_write_dbi(struct dw_pcie
*pci
, void __iomem
*base
,
381 u32 reg
, size_t size
, u32 val
)
383 struct kirin_pcie
*kirin_pcie
= to_kirin_pcie(pci
);
385 kirin_pcie_sideband_dbi_w_mode(kirin_pcie
, true);
386 dw_pcie_write(base
+ reg
, size
, val
);
387 kirin_pcie_sideband_dbi_w_mode(kirin_pcie
, false);
390 static int kirin_pcie_link_up(struct dw_pcie
*pci
)
392 struct kirin_pcie
*kirin_pcie
= to_kirin_pcie(pci
);
393 u32 val
= kirin_apb_ctrl_readl(kirin_pcie
, PCIE_APB_PHY_STATUS0
);
395 if ((val
& PCIE_LINKUP_ENABLE
) == PCIE_LINKUP_ENABLE
)
401 static int kirin_pcie_establish_link(struct pcie_port
*pp
)
403 struct dw_pcie
*pci
= to_dw_pcie_from_pp(pp
);
404 struct kirin_pcie
*kirin_pcie
= to_kirin_pcie(pci
);
405 struct device
*dev
= kirin_pcie
->pci
->dev
;
408 if (kirin_pcie_link_up(pci
))
411 dw_pcie_setup_rc(pp
);
413 /* assert LTSSM enable */
414 kirin_apb_ctrl_writel(kirin_pcie
, PCIE_LTSSM_ENABLE_BIT
,
415 PCIE_APP_LTSSM_ENABLE
);
417 /* check if the link is up or not */
418 while (!kirin_pcie_link_up(pci
)) {
419 usleep_range(LINK_WAIT_MIN
, LINK_WAIT_MAX
);
422 dev_err(dev
, "Link Fail\n");
430 static int kirin_pcie_host_init(struct pcie_port
*pp
)
432 kirin_pcie_establish_link(pp
);
437 static struct dw_pcie_ops kirin_dw_pcie_ops
= {
438 .read_dbi
= kirin_pcie_read_dbi
,
439 .write_dbi
= kirin_pcie_write_dbi
,
440 .link_up
= kirin_pcie_link_up
,
443 static const struct dw_pcie_host_ops kirin_pcie_host_ops
= {
444 .rd_own_conf
= kirin_pcie_rd_own_conf
,
445 .wr_own_conf
= kirin_pcie_wr_own_conf
,
446 .host_init
= kirin_pcie_host_init
,
449 static int __init
kirin_add_pcie_port(struct dw_pcie
*pci
,
450 struct platform_device
*pdev
)
452 pci
->pp
.ops
= &kirin_pcie_host_ops
;
454 return dw_pcie_host_init(&pci
->pp
);
457 static int kirin_pcie_probe(struct platform_device
*pdev
)
459 struct device
*dev
= &pdev
->dev
;
460 struct kirin_pcie
*kirin_pcie
;
465 dev_err(dev
, "NULL node\n");
469 kirin_pcie
= devm_kzalloc(dev
, sizeof(struct kirin_pcie
), GFP_KERNEL
);
473 pci
= devm_kzalloc(dev
, sizeof(*pci
), GFP_KERNEL
);
478 pci
->ops
= &kirin_dw_pcie_ops
;
479 kirin_pcie
->pci
= pci
;
481 ret
= kirin_pcie_get_clk(kirin_pcie
, pdev
);
485 ret
= kirin_pcie_get_resource(kirin_pcie
, pdev
);
489 kirin_pcie
->gpio_id_reset
= of_get_named_gpio(dev
->of_node
,
491 if (kirin_pcie
->gpio_id_reset
< 0)
494 ret
= kirin_pcie_power_on(kirin_pcie
);
498 platform_set_drvdata(pdev
, kirin_pcie
);
500 return kirin_add_pcie_port(pci
, pdev
);
503 static const struct of_device_id kirin_pcie_match
[] = {
504 { .compatible
= "hisilicon,kirin960-pcie" },
508 struct platform_driver kirin_pcie_driver
= {
509 .probe
= kirin_pcie_probe
,
511 .name
= "kirin-pcie",
512 .of_match_table
= kirin_pcie_match
,
513 .suppress_bind_attrs
= true,
516 builtin_platform_driver(kirin_pcie_driver
);