Lines Matching +full:pci +full:- +full:dev

1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2016-2017 HiSilicon Co., Ltd. http://www.hisilicon.com
18 #include <linux/pci.h>
24 #include "pcie-designware.h"
26 #define to_histb_pcie(x) dev_get_drvdata((x)->dev)
53 struct dw_pcie *pci; member
69 return readl(histb_pcie->ctrl + reg); in histb_pcie_readl()
74 writel(val, histb_pcie->ctrl + reg); in histb_pcie_writel()
79 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in histb_pcie_dbi_w_mode() local
80 struct histb_pcie *hipcie = to_histb_pcie(pci); in histb_pcie_dbi_w_mode()
93 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in histb_pcie_dbi_r_mode() local
94 struct histb_pcie *hipcie = to_histb_pcie(pci); in histb_pcie_dbi_r_mode()
105 static u32 histb_pcie_read_dbi(struct dw_pcie *pci, void __iomem *base, in histb_pcie_read_dbi() argument
110 histb_pcie_dbi_r_mode(&pci->pp, true); in histb_pcie_read_dbi()
112 histb_pcie_dbi_r_mode(&pci->pp, false); in histb_pcie_read_dbi()
117 static void histb_pcie_write_dbi(struct dw_pcie *pci, void __iomem *base, in histb_pcie_write_dbi() argument
120 histb_pcie_dbi_w_mode(&pci->pp, true); in histb_pcie_write_dbi()
122 histb_pcie_dbi_w_mode(&pci->pp, false); in histb_pcie_write_dbi()
128 struct dw_pcie *pci = to_dw_pcie_from_pp(bus->sysdata); in histb_pcie_rd_own_conf() local
133 *val = dw_pcie_read_dbi(pci, where, size); in histb_pcie_rd_own_conf()
140 struct dw_pcie *pci = to_dw_pcie_from_pp(bus->sysdata); in histb_pcie_wr_own_conf() local
145 dw_pcie_write_dbi(pci, where, size, val); in histb_pcie_wr_own_conf()
154 static int histb_pcie_link_up(struct dw_pcie *pci) in histb_pcie_link_up() argument
156 struct histb_pcie *hipcie = to_histb_pcie(pci); in histb_pcie_link_up()
170 static int histb_pcie_start_link(struct dw_pcie *pci) in histb_pcie_start_link() argument
172 struct histb_pcie *hipcie = to_histb_pcie(pci); in histb_pcie_start_link()
185 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in histb_pcie_host_init() local
186 struct histb_pcie *hipcie = to_histb_pcie(pci); in histb_pcie_host_init()
189 pp->bridge->ops = &histb_pci_ops; in histb_pcie_host_init()
206 reset_control_assert(hipcie->soft_reset); in histb_pcie_host_disable()
207 reset_control_assert(hipcie->sys_reset); in histb_pcie_host_disable()
208 reset_control_assert(hipcie->bus_reset); in histb_pcie_host_disable()
210 clk_disable_unprepare(hipcie->aux_clk); in histb_pcie_host_disable()
211 clk_disable_unprepare(hipcie->pipe_clk); in histb_pcie_host_disable()
212 clk_disable_unprepare(hipcie->sys_clk); in histb_pcie_host_disable()
213 clk_disable_unprepare(hipcie->bus_clk); in histb_pcie_host_disable()
215 if (hipcie->reset_gpio) in histb_pcie_host_disable()
216 gpiod_set_value_cansleep(hipcie->reset_gpio, 1); in histb_pcie_host_disable()
218 if (hipcie->vpcie) in histb_pcie_host_disable()
219 regulator_disable(hipcie->vpcie); in histb_pcie_host_disable()
224 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in histb_pcie_host_enable() local
225 struct histb_pcie *hipcie = to_histb_pcie(pci); in histb_pcie_host_enable()
226 struct device *dev = pci->dev; in histb_pcie_host_enable() local
230 if (hipcie->vpcie) { in histb_pcie_host_enable()
231 ret = regulator_enable(hipcie->vpcie); in histb_pcie_host_enable()
233 dev_err(dev, "failed to enable regulator: %d\n", ret); in histb_pcie_host_enable()
238 if (hipcie->reset_gpio) in histb_pcie_host_enable()
239 gpiod_set_value_cansleep(hipcie->reset_gpio, 0); in histb_pcie_host_enable()
241 ret = clk_prepare_enable(hipcie->bus_clk); in histb_pcie_host_enable()
243 dev_err(dev, "cannot prepare/enable bus clk\n"); in histb_pcie_host_enable()
247 ret = clk_prepare_enable(hipcie->sys_clk); in histb_pcie_host_enable()
249 dev_err(dev, "cannot prepare/enable sys clk\n"); in histb_pcie_host_enable()
253 ret = clk_prepare_enable(hipcie->pipe_clk); in histb_pcie_host_enable()
255 dev_err(dev, "cannot prepare/enable pipe clk\n"); in histb_pcie_host_enable()
259 ret = clk_prepare_enable(hipcie->aux_clk); in histb_pcie_host_enable()
261 dev_err(dev, "cannot prepare/enable aux clk\n"); in histb_pcie_host_enable()
265 reset_control_assert(hipcie->soft_reset); in histb_pcie_host_enable()
266 reset_control_deassert(hipcie->soft_reset); in histb_pcie_host_enable()
268 reset_control_assert(hipcie->sys_reset); in histb_pcie_host_enable()
269 reset_control_deassert(hipcie->sys_reset); in histb_pcie_host_enable()
271 reset_control_assert(hipcie->bus_reset); in histb_pcie_host_enable()
272 reset_control_deassert(hipcie->bus_reset); in histb_pcie_host_enable()
277 clk_disable_unprepare(hipcie->pipe_clk); in histb_pcie_host_enable()
279 clk_disable_unprepare(hipcie->sys_clk); in histb_pcie_host_enable()
281 clk_disable_unprepare(hipcie->bus_clk); in histb_pcie_host_enable()
283 if (hipcie->vpcie) in histb_pcie_host_enable()
284 regulator_disable(hipcie->vpcie); in histb_pcie_host_enable()
299 struct dw_pcie *pci; in histb_pcie_probe() local
301 struct device *dev = &pdev->dev; in histb_pcie_probe() local
304 hipcie = devm_kzalloc(dev, sizeof(*hipcie), GFP_KERNEL); in histb_pcie_probe()
306 return -ENOMEM; in histb_pcie_probe()
308 pci = devm_kzalloc(dev, sizeof(*pci), GFP_KERNEL); in histb_pcie_probe()
309 if (!pci) in histb_pcie_probe()
310 return -ENOMEM; in histb_pcie_probe()
312 hipcie->pci = pci; in histb_pcie_probe()
313 pp = &pci->pp; in histb_pcie_probe()
314 pci->dev = dev; in histb_pcie_probe()
315 pci->ops = &dw_pcie_ops; in histb_pcie_probe()
317 hipcie->ctrl = devm_platform_ioremap_resource_byname(pdev, "control"); in histb_pcie_probe()
318 if (IS_ERR(hipcie->ctrl)) { in histb_pcie_probe()
319 dev_err(dev, "cannot get control reg base\n"); in histb_pcie_probe()
320 return PTR_ERR(hipcie->ctrl); in histb_pcie_probe()
323 pci->dbi_base = devm_platform_ioremap_resource_byname(pdev, "rc-dbi"); in histb_pcie_probe()
324 if (IS_ERR(pci->dbi_base)) { in histb_pcie_probe()
325 dev_err(dev, "cannot get rc-dbi base\n"); in histb_pcie_probe()
326 return PTR_ERR(pci->dbi_base); in histb_pcie_probe()
329 hipcie->vpcie = devm_regulator_get_optional(dev, "vpcie"); in histb_pcie_probe()
330 if (IS_ERR(hipcie->vpcie)) { in histb_pcie_probe()
331 if (PTR_ERR(hipcie->vpcie) != -ENODEV) in histb_pcie_probe()
332 return PTR_ERR(hipcie->vpcie); in histb_pcie_probe()
333 hipcie->vpcie = NULL; in histb_pcie_probe()
336 hipcie->reset_gpio = devm_gpiod_get_optional(dev, "reset", in histb_pcie_probe()
338 ret = PTR_ERR_OR_ZERO(hipcie->reset_gpio); in histb_pcie_probe()
340 dev_err(dev, "unable to request reset gpio: %d\n", ret); in histb_pcie_probe()
344 ret = gpiod_set_consumer_name(hipcie->reset_gpio, in histb_pcie_probe()
347 dev_err(dev, "unable to set reset gpio name: %d\n", ret); in histb_pcie_probe()
351 hipcie->aux_clk = devm_clk_get(dev, "aux"); in histb_pcie_probe()
352 if (IS_ERR(hipcie->aux_clk)) { in histb_pcie_probe()
353 dev_err(dev, "Failed to get PCIe aux clk\n"); in histb_pcie_probe()
354 return PTR_ERR(hipcie->aux_clk); in histb_pcie_probe()
357 hipcie->pipe_clk = devm_clk_get(dev, "pipe"); in histb_pcie_probe()
358 if (IS_ERR(hipcie->pipe_clk)) { in histb_pcie_probe()
359 dev_err(dev, "Failed to get PCIe pipe clk\n"); in histb_pcie_probe()
360 return PTR_ERR(hipcie->pipe_clk); in histb_pcie_probe()
363 hipcie->sys_clk = devm_clk_get(dev, "sys"); in histb_pcie_probe()
364 if (IS_ERR(hipcie->sys_clk)) { in histb_pcie_probe()
365 dev_err(dev, "Failed to get PCIEe sys clk\n"); in histb_pcie_probe()
366 return PTR_ERR(hipcie->sys_clk); in histb_pcie_probe()
369 hipcie->bus_clk = devm_clk_get(dev, "bus"); in histb_pcie_probe()
370 if (IS_ERR(hipcie->bus_clk)) { in histb_pcie_probe()
371 dev_err(dev, "Failed to get PCIe bus clk\n"); in histb_pcie_probe()
372 return PTR_ERR(hipcie->bus_clk); in histb_pcie_probe()
375 hipcie->soft_reset = devm_reset_control_get(dev, "soft"); in histb_pcie_probe()
376 if (IS_ERR(hipcie->soft_reset)) { in histb_pcie_probe()
377 dev_err(dev, "couldn't get soft reset\n"); in histb_pcie_probe()
378 return PTR_ERR(hipcie->soft_reset); in histb_pcie_probe()
381 hipcie->sys_reset = devm_reset_control_get(dev, "sys"); in histb_pcie_probe()
382 if (IS_ERR(hipcie->sys_reset)) { in histb_pcie_probe()
383 dev_err(dev, "couldn't get sys reset\n"); in histb_pcie_probe()
384 return PTR_ERR(hipcie->sys_reset); in histb_pcie_probe()
387 hipcie->bus_reset = devm_reset_control_get(dev, "bus"); in histb_pcie_probe()
388 if (IS_ERR(hipcie->bus_reset)) { in histb_pcie_probe()
389 dev_err(dev, "couldn't get bus reset\n"); in histb_pcie_probe()
390 return PTR_ERR(hipcie->bus_reset); in histb_pcie_probe()
393 hipcie->phy = devm_phy_get(dev, "phy"); in histb_pcie_probe()
394 if (IS_ERR(hipcie->phy)) { in histb_pcie_probe()
395 dev_info(dev, "no pcie-phy found\n"); in histb_pcie_probe()
396 hipcie->phy = NULL; in histb_pcie_probe()
398 * if no pcie-phy found, phy init in histb_pcie_probe()
402 phy_init(hipcie->phy); in histb_pcie_probe()
405 pp->ops = &histb_pcie_host_ops; in histb_pcie_probe()
411 dev_err(dev, "failed to enable host\n"); in histb_pcie_probe()
417 dev_err(dev, "failed to initialize host\n"); in histb_pcie_probe()
430 if (hipcie->phy) in histb_pcie_remove()
431 phy_exit(hipcie->phy); in histb_pcie_remove()
435 { .compatible = "hisilicon,hi3798cv200-pcie", },
444 .name = "histb-pcie",