Lines Matching +full:rockchip +full:- +full:pcie +full:- +full:phy
1 // SPDX-License-Identifier: GPL-2.0+
3 * Rockchip AXI PCIe host controller driver
5 * Copyright (c) 2016 Rockchip, Inc.
7 * Author: Shawn Lin <shawn.lin@rock-chips.com>
8 * Wenrui Li <wenrui.li@rock-chips.com>
25 #include <linux/phy/phy.h>
29 #include "pcie-rockchip.h"
31 static void rockchip_pcie_enable_bw_int(struct rockchip_pcie *rockchip) in rockchip_pcie_enable_bw_int() argument
35 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL); in rockchip_pcie_enable_bw_int()
37 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL); in rockchip_pcie_enable_bw_int()
40 static void rockchip_pcie_clr_bw_int(struct rockchip_pcie *rockchip) in rockchip_pcie_clr_bw_int() argument
44 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL); in rockchip_pcie_clr_bw_int()
46 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL); in rockchip_pcie_clr_bw_int()
49 static void rockchip_pcie_update_txcredit_mui(struct rockchip_pcie *rockchip) in rockchip_pcie_update_txcredit_mui() argument
54 val = rockchip_pcie_read(rockchip, PCIE_CORE_TXCREDIT_CFG1); in rockchip_pcie_update_txcredit_mui()
57 rockchip_pcie_write(rockchip, val, PCIE_CORE_TXCREDIT_CFG1); in rockchip_pcie_update_txcredit_mui()
60 static int rockchip_pcie_valid_device(struct rockchip_pcie *rockchip, in rockchip_pcie_valid_device() argument
68 if (pci_is_root_bus(bus) || pci_is_root_bus(bus->parent)) in rockchip_pcie_valid_device()
74 static u8 rockchip_pcie_lane_map(struct rockchip_pcie *rockchip) in rockchip_pcie_lane_map() argument
79 if (rockchip->legacy_phy) in rockchip_pcie_lane_map()
80 return GENMASK(MAX_LANE_NUM - 1, 0); in rockchip_pcie_lane_map()
82 val = rockchip_pcie_read(rockchip, PCIE_CORE_LANE_MAP); in rockchip_pcie_lane_map()
85 /* The link may be using a reverse-indexed mapping. */ in rockchip_pcie_lane_map()
92 static int rockchip_pcie_rd_own_conf(struct rockchip_pcie *rockchip, in rockchip_pcie_rd_own_conf() argument
97 addr = rockchip->apb_base + PCIE_RC_CONFIG_NORMAL_BASE + where; in rockchip_pcie_rd_own_conf()
117 static int rockchip_pcie_wr_own_conf(struct rockchip_pcie *rockchip, in rockchip_pcie_wr_own_conf() argument
124 addr = rockchip->apb_base + PCIE_RC_CONFIG_NORMAL_BASE + offset; in rockchip_pcie_wr_own_conf()
131 mask = ~(((1 << (size * 8)) - 1) << ((where & 0x3) * 8)); in rockchip_pcie_wr_own_conf()
145 static int rockchip_pcie_rd_other_conf(struct rockchip_pcie *rockchip, in rockchip_pcie_rd_other_conf() argument
151 addr = rockchip->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); in rockchip_pcie_rd_other_conf()
158 if (pci_is_root_bus(bus->parent)) in rockchip_pcie_rd_other_conf()
159 rockchip_pcie_cfg_configuration_accesses(rockchip, in rockchip_pcie_rd_other_conf()
162 rockchip_pcie_cfg_configuration_accesses(rockchip, in rockchip_pcie_rd_other_conf()
178 static int rockchip_pcie_wr_other_conf(struct rockchip_pcie *rockchip, in rockchip_pcie_wr_other_conf() argument
184 addr = rockchip->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); in rockchip_pcie_wr_other_conf()
189 if (pci_is_root_bus(bus->parent)) in rockchip_pcie_wr_other_conf()
190 rockchip_pcie_cfg_configuration_accesses(rockchip, in rockchip_pcie_wr_other_conf()
193 rockchip_pcie_cfg_configuration_accesses(rockchip, in rockchip_pcie_wr_other_conf()
211 struct rockchip_pcie *rockchip = bus->sysdata; in rockchip_pcie_rd_conf() local
213 if (!rockchip_pcie_valid_device(rockchip, bus, PCI_SLOT(devfn))) in rockchip_pcie_rd_conf()
217 return rockchip_pcie_rd_own_conf(rockchip, where, size, val); in rockchip_pcie_rd_conf()
219 return rockchip_pcie_rd_other_conf(rockchip, bus, devfn, where, size, in rockchip_pcie_rd_conf()
226 struct rockchip_pcie *rockchip = bus->sysdata; in rockchip_pcie_wr_conf() local
228 if (!rockchip_pcie_valid_device(rockchip, bus, PCI_SLOT(devfn))) in rockchip_pcie_wr_conf()
232 return rockchip_pcie_wr_own_conf(rockchip, where, size, val); in rockchip_pcie_wr_conf()
234 return rockchip_pcie_wr_other_conf(rockchip, bus, devfn, where, size, in rockchip_pcie_wr_conf()
243 static void rockchip_pcie_set_power_limit(struct rockchip_pcie *rockchip) in rockchip_pcie_set_power_limit() argument
248 if (IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_set_power_limit()
257 curr = regulator_get_current_limit(rockchip->vpcie3v3); in rockchip_pcie_set_power_limit()
266 dev_warn(rockchip->dev, "invalid power supply\n"); in rockchip_pcie_set_power_limit()
269 scale--; in rockchip_pcie_set_power_limit()
273 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_DEVCAP); in rockchip_pcie_set_power_limit()
276 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_DEVCAP); in rockchip_pcie_set_power_limit()
280 * rockchip_pcie_host_init_port - Initialize hardware
281 * @rockchip: PCIe port information
283 static int rockchip_pcie_host_init_port(struct rockchip_pcie *rockchip) in rockchip_pcie_host_init_port() argument
285 struct device *dev = rockchip->dev; in rockchip_pcie_host_init_port()
289 gpiod_set_value_cansleep(rockchip->perst_gpio, 0); in rockchip_pcie_host_init_port()
291 err = rockchip_pcie_init_port(rockchip); in rockchip_pcie_host_init_port()
296 status = rockchip_pcie_read(rockchip, PCIE_CORE_CTRL_PLC1); in rockchip_pcie_host_init_port()
299 rockchip_pcie_write(rockchip, status, PCIE_CORE_CTRL_PLC1); in rockchip_pcie_host_init_port()
301 rockchip_pcie_set_power_limit(rockchip); in rockchip_pcie_host_init_port()
304 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL); in rockchip_pcie_host_init_port()
306 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL); in rockchip_pcie_host_init_port()
309 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL); in rockchip_pcie_host_init_port()
311 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL); in rockchip_pcie_host_init_port()
314 rockchip_pcie_write(rockchip, PCIE_CLIENT_LINK_TRAIN_ENABLE, in rockchip_pcie_host_init_port()
318 gpiod_set_value_cansleep(rockchip->perst_gpio, 1); in rockchip_pcie_host_init_port()
323 err = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_BASIC_STATUS1, in rockchip_pcie_host_init_port()
327 dev_err(dev, "PCIe link training gen1 timeout!\n"); in rockchip_pcie_host_init_port()
331 if (rockchip->link_gen == 2) { in rockchip_pcie_host_init_port()
336 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL2); in rockchip_pcie_host_init_port()
339 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL2); in rockchip_pcie_host_init_port()
340 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL); in rockchip_pcie_host_init_port()
342 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL); in rockchip_pcie_host_init_port()
344 err = readl_poll_timeout(rockchip->apb_base + PCIE_CORE_CTRL, in rockchip_pcie_host_init_port()
348 dev_dbg(dev, "PCIe link training gen2 timeout, fall back to gen1!\n"); in rockchip_pcie_host_init_port()
352 status = rockchip_pcie_read(rockchip, PCIE_CORE_CTRL); in rockchip_pcie_host_init_port()
358 rockchip->lanes_map = rockchip_pcie_lane_map(rockchip); in rockchip_pcie_host_init_port()
360 if (!(rockchip->lanes_map & BIT(i))) { in rockchip_pcie_host_init_port()
362 phy_power_off(rockchip->phys[i]); in rockchip_pcie_host_init_port()
366 rockchip_pcie_write(rockchip, PCI_VENDOR_ID_ROCKCHIP, in rockchip_pcie_host_init_port()
368 rockchip_pcie_write(rockchip, in rockchip_pcie_host_init_port()
373 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_THP_CAP); in rockchip_pcie_host_init_port()
375 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_THP_CAP); in rockchip_pcie_host_init_port()
378 if (of_property_read_bool(dev->of_node, "aspm-no-l0s")) { in rockchip_pcie_host_init_port()
379 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCAP); in rockchip_pcie_host_init_port()
381 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCAP); in rockchip_pcie_host_init_port()
384 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_DEVCTL); in rockchip_pcie_host_init_port()
387 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_DEVCTL); in rockchip_pcie_host_init_port()
391 while (i--) in rockchip_pcie_host_init_port()
392 phy_power_off(rockchip->phys[i]); in rockchip_pcie_host_init_port()
394 while (i--) in rockchip_pcie_host_init_port()
395 phy_exit(rockchip->phys[i]); in rockchip_pcie_host_init_port()
401 struct rockchip_pcie *rockchip = arg; in rockchip_pcie_subsys_irq_handler() local
402 struct device *dev = rockchip->dev; in rockchip_pcie_subsys_irq_handler()
406 reg = rockchip_pcie_read(rockchip, PCIE_CLIENT_INT_STATUS); in rockchip_pcie_subsys_irq_handler()
409 sub_reg = rockchip_pcie_read(rockchip, PCIE_CORE_INT_STATUS); in rockchip_pcie_subsys_irq_handler()
432 dev_dbg(dev, "phy error detected on receive side\n"); in rockchip_pcie_subsys_irq_handler()
452 rockchip_pcie_write(rockchip, sub_reg, PCIE_CORE_INT_STATUS); in rockchip_pcie_subsys_irq_handler()
454 dev_dbg(dev, "phy link changes\n"); in rockchip_pcie_subsys_irq_handler()
455 rockchip_pcie_update_txcredit_mui(rockchip); in rockchip_pcie_subsys_irq_handler()
456 rockchip_pcie_clr_bw_int(rockchip); in rockchip_pcie_subsys_irq_handler()
459 rockchip_pcie_write(rockchip, reg & PCIE_CLIENT_INT_LOCAL, in rockchip_pcie_subsys_irq_handler()
467 struct rockchip_pcie *rockchip = arg; in rockchip_pcie_client_irq_handler() local
468 struct device *dev = rockchip->dev; in rockchip_pcie_client_irq_handler()
471 reg = rockchip_pcie_read(rockchip, PCIE_CLIENT_INT_STATUS); in rockchip_pcie_client_irq_handler()
494 dev_dbg(dev, "phy interrupt received\n"); in rockchip_pcie_client_irq_handler()
496 rockchip_pcie_write(rockchip, reg & (PCIE_CLIENT_INT_LEGACY_DONE | in rockchip_pcie_client_irq_handler()
510 struct rockchip_pcie *rockchip = irq_desc_get_handler_data(desc); in rockchip_pcie_intx_handler() local
511 struct device *dev = rockchip->dev; in rockchip_pcie_intx_handler()
518 reg = rockchip_pcie_read(rockchip, PCIE_CLIENT_INT_STATUS); in rockchip_pcie_intx_handler()
522 hwirq = ffs(reg) - 1; in rockchip_pcie_intx_handler()
525 ret = generic_handle_domain_irq(rockchip->irq_domain, hwirq); in rockchip_pcie_intx_handler()
533 static int rockchip_pcie_setup_irq(struct rockchip_pcie *rockchip) in rockchip_pcie_setup_irq() argument
536 struct device *dev = rockchip->dev; in rockchip_pcie_setup_irq()
544 IRQF_SHARED, "pcie-sys", rockchip); in rockchip_pcie_setup_irq()
546 dev_err(dev, "failed to request PCIe subsystem IRQ\n"); in rockchip_pcie_setup_irq()
556 rockchip); in rockchip_pcie_setup_irq()
563 IRQF_SHARED, "pcie-client", rockchip); in rockchip_pcie_setup_irq()
565 dev_err(dev, "failed to request PCIe client IRQ\n"); in rockchip_pcie_setup_irq()
573 * rockchip_pcie_parse_host_dt - Parse Device Tree
574 * @rockchip: PCIe port information
578 static int rockchip_pcie_parse_host_dt(struct rockchip_pcie *rockchip) in rockchip_pcie_parse_host_dt() argument
580 struct device *dev = rockchip->dev; in rockchip_pcie_parse_host_dt()
583 err = rockchip_pcie_parse_dt(rockchip); in rockchip_pcie_parse_host_dt()
587 rockchip->vpcie12v = devm_regulator_get_optional(dev, "vpcie12v"); in rockchip_pcie_parse_host_dt()
588 if (IS_ERR(rockchip->vpcie12v)) { in rockchip_pcie_parse_host_dt()
589 if (PTR_ERR(rockchip->vpcie12v) != -ENODEV) in rockchip_pcie_parse_host_dt()
590 return PTR_ERR(rockchip->vpcie12v); in rockchip_pcie_parse_host_dt()
594 rockchip->vpcie3v3 = devm_regulator_get_optional(dev, "vpcie3v3"); in rockchip_pcie_parse_host_dt()
595 if (IS_ERR(rockchip->vpcie3v3)) { in rockchip_pcie_parse_host_dt()
596 if (PTR_ERR(rockchip->vpcie3v3) != -ENODEV) in rockchip_pcie_parse_host_dt()
597 return PTR_ERR(rockchip->vpcie3v3); in rockchip_pcie_parse_host_dt()
601 rockchip->vpcie1v8 = devm_regulator_get(dev, "vpcie1v8"); in rockchip_pcie_parse_host_dt()
602 if (IS_ERR(rockchip->vpcie1v8)) in rockchip_pcie_parse_host_dt()
603 return PTR_ERR(rockchip->vpcie1v8); in rockchip_pcie_parse_host_dt()
605 rockchip->vpcie0v9 = devm_regulator_get(dev, "vpcie0v9"); in rockchip_pcie_parse_host_dt()
606 if (IS_ERR(rockchip->vpcie0v9)) in rockchip_pcie_parse_host_dt()
607 return PTR_ERR(rockchip->vpcie0v9); in rockchip_pcie_parse_host_dt()
612 static int rockchip_pcie_set_vpcie(struct rockchip_pcie *rockchip) in rockchip_pcie_set_vpcie() argument
614 struct device *dev = rockchip->dev; in rockchip_pcie_set_vpcie()
617 if (!IS_ERR(rockchip->vpcie12v)) { in rockchip_pcie_set_vpcie()
618 err = regulator_enable(rockchip->vpcie12v); in rockchip_pcie_set_vpcie()
625 if (!IS_ERR(rockchip->vpcie3v3)) { in rockchip_pcie_set_vpcie()
626 err = regulator_enable(rockchip->vpcie3v3); in rockchip_pcie_set_vpcie()
633 err = regulator_enable(rockchip->vpcie1v8); in rockchip_pcie_set_vpcie()
639 err = regulator_enable(rockchip->vpcie0v9); in rockchip_pcie_set_vpcie()
648 regulator_disable(rockchip->vpcie1v8); in rockchip_pcie_set_vpcie()
650 if (!IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_set_vpcie()
651 regulator_disable(rockchip->vpcie3v3); in rockchip_pcie_set_vpcie()
653 if (!IS_ERR(rockchip->vpcie12v)) in rockchip_pcie_set_vpcie()
654 regulator_disable(rockchip->vpcie12v); in rockchip_pcie_set_vpcie()
659 static void rockchip_pcie_enable_interrupts(struct rockchip_pcie *rockchip) in rockchip_pcie_enable_interrupts() argument
661 rockchip_pcie_write(rockchip, (PCIE_CLIENT_INT_CLI << 16) & in rockchip_pcie_enable_interrupts()
663 rockchip_pcie_write(rockchip, (u32)(~PCIE_CORE_INT), in rockchip_pcie_enable_interrupts()
666 rockchip_pcie_enable_bw_int(rockchip); in rockchip_pcie_enable_interrupts()
673 irq_set_chip_data(irq, domain->host_data); in rockchip_pcie_intx_map()
682 static int rockchip_pcie_init_irq_domain(struct rockchip_pcie *rockchip) in rockchip_pcie_init_irq_domain() argument
684 struct device *dev = rockchip->dev; in rockchip_pcie_init_irq_domain()
685 struct device_node *intc = of_get_next_child(dev->of_node, NULL); in rockchip_pcie_init_irq_domain()
688 dev_err(dev, "missing child interrupt-controller node\n"); in rockchip_pcie_init_irq_domain()
689 return -EINVAL; in rockchip_pcie_init_irq_domain()
692 rockchip->irq_domain = irq_domain_create_linear(of_fwnode_handle(intc), PCI_NUM_INTX, in rockchip_pcie_init_irq_domain()
693 &intx_domain_ops, rockchip); in rockchip_pcie_init_irq_domain()
695 if (!rockchip->irq_domain) { in rockchip_pcie_init_irq_domain()
697 return -EINVAL; in rockchip_pcie_init_irq_domain()
703 static int rockchip_pcie_prog_ob_atu(struct rockchip_pcie *rockchip, in rockchip_pcie_prog_ob_atu() argument
713 return -EINVAL; in rockchip_pcie_prog_ob_atu()
715 return -EINVAL; in rockchip_pcie_prog_ob_atu()
717 return -EINVAL; in rockchip_pcie_prog_ob_atu()
720 return -EINVAL; in rockchip_pcie_prog_ob_atu()
724 return -EINVAL; in rockchip_pcie_prog_ob_atu()
734 rockchip_pcie_write(rockchip, ob_addr_0, in rockchip_pcie_prog_ob_atu()
736 rockchip_pcie_write(rockchip, ob_addr_1, in rockchip_pcie_prog_ob_atu()
738 rockchip_pcie_write(rockchip, ob_desc_0, in rockchip_pcie_prog_ob_atu()
740 rockchip_pcie_write(rockchip, 0, in rockchip_pcie_prog_ob_atu()
746 static int rockchip_pcie_prog_ib_atu(struct rockchip_pcie *rockchip, in rockchip_pcie_prog_ib_atu() argument
755 return -EINVAL; in rockchip_pcie_prog_ib_atu()
757 return -EINVAL; in rockchip_pcie_prog_ib_atu()
759 return -EINVAL; in rockchip_pcie_prog_ib_atu()
767 rockchip_pcie_write(rockchip, ib_addr_0, PCIE_RP_IB_ADDR0 + aw_offset); in rockchip_pcie_prog_ib_atu()
768 rockchip_pcie_write(rockchip, ib_addr_1, PCIE_RP_IB_ADDR1 + aw_offset); in rockchip_pcie_prog_ib_atu()
773 static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip) in rockchip_pcie_cfg_atu() argument
775 struct device *dev = rockchip->dev; in rockchip_pcie_cfg_atu()
776 struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rockchip); in rockchip_pcie_cfg_atu()
783 rockchip_pcie_cfg_configuration_accesses(rockchip, in rockchip_pcie_cfg_atu()
785 entry = resource_list_first_type(&bridge->windows, IORESOURCE_MEM); in rockchip_pcie_cfg_atu()
787 return -ENODEV; in rockchip_pcie_cfg_atu()
789 size = resource_size(entry->res); in rockchip_pcie_cfg_atu()
790 pci_addr = entry->res->start - entry->offset; in rockchip_pcie_cfg_atu()
791 rockchip->msg_bus_addr = pci_addr; in rockchip_pcie_cfg_atu()
794 err = rockchip_pcie_prog_ob_atu(rockchip, reg_no + 1, in rockchip_pcie_cfg_atu()
796 20 - 1, in rockchip_pcie_cfg_atu()
805 err = rockchip_pcie_prog_ib_atu(rockchip, 2, 32 - 1, 0x0, 0); in rockchip_pcie_cfg_atu()
811 entry = resource_list_first_type(&bridge->windows, IORESOURCE_IO); in rockchip_pcie_cfg_atu()
813 return -ENODEV; in rockchip_pcie_cfg_atu()
818 size = resource_size(entry->res); in rockchip_pcie_cfg_atu()
819 pci_addr = entry->res->start - entry->offset; in rockchip_pcie_cfg_atu()
822 err = rockchip_pcie_prog_ob_atu(rockchip, in rockchip_pcie_cfg_atu()
825 20 - 1, in rockchip_pcie_cfg_atu()
835 rockchip_pcie_prog_ob_atu(rockchip, reg_no + 1 + offset, in rockchip_pcie_cfg_atu()
837 20 - 1, 0, 0); in rockchip_pcie_cfg_atu()
839 rockchip->msg_bus_addr += ((reg_no + offset) << 20); in rockchip_pcie_cfg_atu()
843 static int rockchip_pcie_wait_l2(struct rockchip_pcie *rockchip) in rockchip_pcie_wait_l2() argument
849 writel(0x0, rockchip->msg_region + PCIE_RC_SEND_PME_OFF); in rockchip_pcie_wait_l2()
852 err = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_DEBUG_OUT_0, in rockchip_pcie_wait_l2()
856 dev_err(rockchip->dev, "PCIe link enter L2 timeout!\n"); in rockchip_pcie_wait_l2()
865 struct rockchip_pcie *rockchip = dev_get_drvdata(dev); in rockchip_pcie_suspend_noirq() local
869 rockchip_pcie_write(rockchip, (PCIE_CLIENT_INT_CLI << 16) | in rockchip_pcie_suspend_noirq()
871 rockchip_pcie_write(rockchip, (u32)PCIE_CORE_INT, PCIE_CORE_INT_MASK); in rockchip_pcie_suspend_noirq()
873 ret = rockchip_pcie_wait_l2(rockchip); in rockchip_pcie_suspend_noirq()
875 rockchip_pcie_enable_interrupts(rockchip); in rockchip_pcie_suspend_noirq()
879 rockchip_pcie_deinit_phys(rockchip); in rockchip_pcie_suspend_noirq()
881 rockchip_pcie_disable_clocks(rockchip); in rockchip_pcie_suspend_noirq()
883 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_suspend_noirq()
890 struct rockchip_pcie *rockchip = dev_get_drvdata(dev); in rockchip_pcie_resume_noirq() local
893 err = regulator_enable(rockchip->vpcie0v9); in rockchip_pcie_resume_noirq()
899 err = rockchip_pcie_enable_clocks(rockchip); in rockchip_pcie_resume_noirq()
903 err = rockchip_pcie_host_init_port(rockchip); in rockchip_pcie_resume_noirq()
907 err = rockchip_pcie_cfg_atu(rockchip); in rockchip_pcie_resume_noirq()
912 rockchip_pcie_update_txcredit_mui(rockchip); in rockchip_pcie_resume_noirq()
913 rockchip_pcie_enable_interrupts(rockchip); in rockchip_pcie_resume_noirq()
918 rockchip_pcie_deinit_phys(rockchip); in rockchip_pcie_resume_noirq()
920 rockchip_pcie_disable_clocks(rockchip); in rockchip_pcie_resume_noirq()
922 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_resume_noirq()
928 struct rockchip_pcie *rockchip; in rockchip_pcie_probe() local
929 struct device *dev = &pdev->dev; in rockchip_pcie_probe()
933 if (!dev->of_node) in rockchip_pcie_probe()
934 return -ENODEV; in rockchip_pcie_probe()
936 bridge = devm_pci_alloc_host_bridge(dev, sizeof(*rockchip)); in rockchip_pcie_probe()
938 return -ENOMEM; in rockchip_pcie_probe()
940 rockchip = pci_host_bridge_priv(bridge); in rockchip_pcie_probe()
942 platform_set_drvdata(pdev, rockchip); in rockchip_pcie_probe()
943 rockchip->dev = dev; in rockchip_pcie_probe()
944 rockchip->is_rc = true; in rockchip_pcie_probe()
946 err = rockchip_pcie_parse_host_dt(rockchip); in rockchip_pcie_probe()
950 err = rockchip_pcie_enable_clocks(rockchip); in rockchip_pcie_probe()
954 err = rockchip_pcie_set_vpcie(rockchip); in rockchip_pcie_probe()
960 err = rockchip_pcie_host_init_port(rockchip); in rockchip_pcie_probe()
964 err = rockchip_pcie_init_irq_domain(rockchip); in rockchip_pcie_probe()
968 err = rockchip_pcie_cfg_atu(rockchip); in rockchip_pcie_probe()
972 rockchip->msg_region = devm_ioremap(dev, rockchip->msg_bus_addr, SZ_1M); in rockchip_pcie_probe()
973 if (!rockchip->msg_region) { in rockchip_pcie_probe()
974 err = -ENOMEM; in rockchip_pcie_probe()
978 bridge->sysdata = rockchip; in rockchip_pcie_probe()
979 bridge->ops = &rockchip_pcie_ops; in rockchip_pcie_probe()
981 err = rockchip_pcie_setup_irq(rockchip); in rockchip_pcie_probe()
985 rockchip_pcie_enable_interrupts(rockchip); in rockchip_pcie_probe()
994 irq_domain_remove(rockchip->irq_domain); in rockchip_pcie_probe()
996 rockchip_pcie_deinit_phys(rockchip); in rockchip_pcie_probe()
998 if (!IS_ERR(rockchip->vpcie12v)) in rockchip_pcie_probe()
999 regulator_disable(rockchip->vpcie12v); in rockchip_pcie_probe()
1000 if (!IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_probe()
1001 regulator_disable(rockchip->vpcie3v3); in rockchip_pcie_probe()
1002 regulator_disable(rockchip->vpcie1v8); in rockchip_pcie_probe()
1003 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_probe()
1005 rockchip_pcie_disable_clocks(rockchip); in rockchip_pcie_probe()
1011 struct device *dev = &pdev->dev; in rockchip_pcie_remove()
1012 struct rockchip_pcie *rockchip = dev_get_drvdata(dev); in rockchip_pcie_remove() local
1013 struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rockchip); in rockchip_pcie_remove()
1015 pci_stop_root_bus(bridge->bus); in rockchip_pcie_remove()
1016 pci_remove_root_bus(bridge->bus); in rockchip_pcie_remove()
1017 irq_domain_remove(rockchip->irq_domain); in rockchip_pcie_remove()
1019 rockchip_pcie_deinit_phys(rockchip); in rockchip_pcie_remove()
1021 rockchip_pcie_disable_clocks(rockchip); in rockchip_pcie_remove()
1023 if (!IS_ERR(rockchip->vpcie12v)) in rockchip_pcie_remove()
1024 regulator_disable(rockchip->vpcie12v); in rockchip_pcie_remove()
1025 if (!IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_remove()
1026 regulator_disable(rockchip->vpcie3v3); in rockchip_pcie_remove()
1027 regulator_disable(rockchip->vpcie1v8); in rockchip_pcie_remove()
1028 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_remove()
1037 { .compatible = "rockchip,rk3399-pcie", },
1044 .name = "rockchip-pcie",
1053 MODULE_AUTHOR("Rockchip Inc");
1054 MODULE_DESCRIPTION("Rockchip AXI PCIe driver");