Lines Matching +full:sctrl +full:- +full:syscon
1 // SPDX-License-Identifier: GPL-2.0
17 #include <linux/mfd/syscon.h>
27 #include "pcie-designware.h"
29 #define to_kirin_pcie(x) dev_get_drvdata((x)->dev)
99 writel(val, kirin_pcie->apb_base + reg); in kirin_apb_ctrl_writel()
104 return readl(kirin_pcie->apb_base + reg); in kirin_apb_ctrl_readl()
111 writel(val, kirin_pcie->phy_base + reg); in kirin_apb_phy_writel()
116 return readl(kirin_pcie->phy_base + reg); in kirin_apb_phy_readl()
122 struct device *dev = &pdev->dev; in kirin_pcie_get_clk()
124 kirin_pcie->phy_ref_clk = devm_clk_get(dev, "pcie_phy_ref"); in kirin_pcie_get_clk()
125 if (IS_ERR(kirin_pcie->phy_ref_clk)) in kirin_pcie_get_clk()
126 return PTR_ERR(kirin_pcie->phy_ref_clk); in kirin_pcie_get_clk()
128 kirin_pcie->pcie_aux_clk = devm_clk_get(dev, "pcie_aux"); in kirin_pcie_get_clk()
129 if (IS_ERR(kirin_pcie->pcie_aux_clk)) in kirin_pcie_get_clk()
130 return PTR_ERR(kirin_pcie->pcie_aux_clk); in kirin_pcie_get_clk()
132 kirin_pcie->apb_phy_clk = devm_clk_get(dev, "pcie_apb_phy"); in kirin_pcie_get_clk()
133 if (IS_ERR(kirin_pcie->apb_phy_clk)) in kirin_pcie_get_clk()
134 return PTR_ERR(kirin_pcie->apb_phy_clk); in kirin_pcie_get_clk()
136 kirin_pcie->apb_sys_clk = devm_clk_get(dev, "pcie_apb_sys"); in kirin_pcie_get_clk()
137 if (IS_ERR(kirin_pcie->apb_sys_clk)) in kirin_pcie_get_clk()
138 return PTR_ERR(kirin_pcie->apb_sys_clk); in kirin_pcie_get_clk()
140 kirin_pcie->pcie_aclk = devm_clk_get(dev, "pcie_aclk"); in kirin_pcie_get_clk()
141 if (IS_ERR(kirin_pcie->pcie_aclk)) in kirin_pcie_get_clk()
142 return PTR_ERR(kirin_pcie->pcie_aclk); in kirin_pcie_get_clk()
150 kirin_pcie->apb_base = in kirin_pcie_get_resource()
152 if (IS_ERR(kirin_pcie->apb_base)) in kirin_pcie_get_resource()
153 return PTR_ERR(kirin_pcie->apb_base); in kirin_pcie_get_resource()
155 kirin_pcie->phy_base = in kirin_pcie_get_resource()
157 if (IS_ERR(kirin_pcie->phy_base)) in kirin_pcie_get_resource()
158 return PTR_ERR(kirin_pcie->phy_base); in kirin_pcie_get_resource()
160 kirin_pcie->pci->dbi_base = in kirin_pcie_get_resource()
162 if (IS_ERR(kirin_pcie->pci->dbi_base)) in kirin_pcie_get_resource()
163 return PTR_ERR(kirin_pcie->pci->dbi_base); in kirin_pcie_get_resource()
165 kirin_pcie->crgctrl = in kirin_pcie_get_resource()
166 syscon_regmap_lookup_by_compatible("hisilicon,hi3660-crgctrl"); in kirin_pcie_get_resource()
167 if (IS_ERR(kirin_pcie->crgctrl)) in kirin_pcie_get_resource()
168 return PTR_ERR(kirin_pcie->crgctrl); in kirin_pcie_get_resource()
170 kirin_pcie->sysctrl = in kirin_pcie_get_resource()
171 syscon_regmap_lookup_by_compatible("hisilicon,hi3660-sctrl"); in kirin_pcie_get_resource()
172 if (IS_ERR(kirin_pcie->sysctrl)) in kirin_pcie_get_resource()
173 return PTR_ERR(kirin_pcie->sysctrl); in kirin_pcie_get_resource()
180 struct device *dev = kirin_pcie->pci->dev; in kirin_pcie_phy_init()
200 return -EINVAL; in kirin_pcie_phy_init()
210 regmap_read(kirin_pcie->sysctrl, SCTRL_PCIE_OE_OFFSET, &val); in kirin_pcie_oe_enable()
213 regmap_write(kirin_pcie->sysctrl, SCTRL_PCIE_OE_OFFSET, val); in kirin_pcie_oe_enable()
223 ret = clk_set_rate(kirin_pcie->phy_ref_clk, REF_CLK_FREQ); in kirin_pcie_clk_ctrl()
227 ret = clk_prepare_enable(kirin_pcie->phy_ref_clk); in kirin_pcie_clk_ctrl()
231 ret = clk_prepare_enable(kirin_pcie->apb_sys_clk); in kirin_pcie_clk_ctrl()
235 ret = clk_prepare_enable(kirin_pcie->apb_phy_clk); in kirin_pcie_clk_ctrl()
239 ret = clk_prepare_enable(kirin_pcie->pcie_aclk); in kirin_pcie_clk_ctrl()
243 ret = clk_prepare_enable(kirin_pcie->pcie_aux_clk); in kirin_pcie_clk_ctrl()
250 clk_disable_unprepare(kirin_pcie->pcie_aux_clk); in kirin_pcie_clk_ctrl()
252 clk_disable_unprepare(kirin_pcie->pcie_aclk); in kirin_pcie_clk_ctrl()
254 clk_disable_unprepare(kirin_pcie->apb_phy_clk); in kirin_pcie_clk_ctrl()
256 clk_disable_unprepare(kirin_pcie->apb_sys_clk); in kirin_pcie_clk_ctrl()
258 clk_disable_unprepare(kirin_pcie->phy_ref_clk); in kirin_pcie_clk_ctrl()
268 regmap_write(kirin_pcie->sysctrl, in kirin_pcie_power_on()
278 regmap_write(kirin_pcie->sysctrl, in kirin_pcie_power_on()
280 regmap_write(kirin_pcie->crgctrl, in kirin_pcie_power_on()
282 regmap_write(kirin_pcie->sysctrl, in kirin_pcie_power_on()
290 if (!gpio_request(kirin_pcie->gpio_id_reset, "pcie_perst")) { in kirin_pcie_power_on()
292 ret = gpio_direction_output(kirin_pcie->gpio_id_reset, 1); in kirin_pcie_power_on()
336 struct dw_pcie *pci = to_dw_pcie_from_pp(bus->sysdata); in kirin_pcie_rd_own_conf()
350 struct dw_pcie *pci = to_dw_pcie_from_pp(bus->sysdata); in kirin_pcie_wr_own_conf()
402 struct device *dev = kirin_pcie->pci->dev; in kirin_pcie_establish_link()
420 return -EINVAL; in kirin_pcie_establish_link()
429 pp->bridge->ops = &kirin_pci_ops; in kirin_pcie_host_init()
457 pci->pp.msi_irq = irq; in kirin_pcie_add_msi()
472 pci->pp.ops = &kirin_pcie_host_ops; in kirin_add_pcie_port()
474 return dw_pcie_host_init(&pci->pp); in kirin_add_pcie_port()
479 struct device *dev = &pdev->dev; in kirin_pcie_probe()
484 if (!dev->of_node) { in kirin_pcie_probe()
486 return -EINVAL; in kirin_pcie_probe()
491 return -ENOMEM; in kirin_pcie_probe()
495 return -ENOMEM; in kirin_pcie_probe()
497 pci->dev = dev; in kirin_pcie_probe()
498 pci->ops = &kirin_dw_pcie_ops; in kirin_pcie_probe()
499 kirin_pcie->pci = pci; in kirin_pcie_probe()
509 kirin_pcie->gpio_id_reset = of_get_named_gpio(dev->of_node, in kirin_pcie_probe()
510 "reset-gpios", 0); in kirin_pcie_probe()
511 if (kirin_pcie->gpio_id_reset == -EPROBE_DEFER) { in kirin_pcie_probe()
512 return -EPROBE_DEFER; in kirin_pcie_probe()
513 } else if (!gpio_is_valid(kirin_pcie->gpio_id_reset)) { in kirin_pcie_probe()
515 return -ENODEV; in kirin_pcie_probe()
528 { .compatible = "hisilicon,kirin960-pcie" },
535 .name = "kirin-pcie",