kirin_pcie
static int hi3660_pcie_phy_power_on(struct kirin_pcie *pcie)
struct kirin_pcie *pcie)
static int hi3660_pcie_phy_power_off(struct kirin_pcie *pcie)
static int kirin_pcie_get_gpio_enable(struct kirin_pcie *pcie,
static int kirin_pcie_parse_port(struct kirin_pcie *pcie,
static long kirin_pcie_get_resource(struct kirin_pcie *kirin_pcie,
kirin_pcie->apb = devm_regmap_init_mmio(dev, apb_base,
if (IS_ERR(kirin_pcie->apb))
return PTR_ERR(kirin_pcie->apb);
kirin_pcie->id_dwc_perst_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
if (IS_ERR(kirin_pcie->id_dwc_perst_gpio))
return dev_err_probe(dev, PTR_ERR(kirin_pcie->id_dwc_perst_gpio),
gpiod_set_consumer_name(kirin_pcie->id_dwc_perst_gpio, "pcie_perst_bridge");
ret = kirin_pcie_get_gpio_enable(kirin_pcie, pdev);
ret = kirin_pcie_parse_port(kirin_pcie, pdev, child);
static void kirin_pcie_sideband_dbi_w_mode(struct kirin_pcie *kirin_pcie,
regmap_read(kirin_pcie->apb, SOC_PCIECTRL_CTRL0_ADDR, &val);
regmap_write(kirin_pcie->apb, SOC_PCIECTRL_CTRL0_ADDR, val);
static void kirin_pcie_sideband_dbi_r_mode(struct kirin_pcie *kirin_pcie,
regmap_read(kirin_pcie->apb, SOC_PCIECTRL_CTRL1_ADDR, &val);
regmap_write(kirin_pcie->apb, SOC_PCIECTRL_CTRL1_ADDR, val);
struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci);
if (!kirin_pcie->num_slots)
for (i = 0; i < kirin_pcie->num_slots; i++) {
ret = gpiod_direction_output_raw(kirin_pcie->id_reset_gpio[i], 1);
kirin_pcie->reset_names[i], ret);
struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci);
kirin_pcie_sideband_dbi_r_mode(kirin_pcie, true);
kirin_pcie_sideband_dbi_r_mode(kirin_pcie, false);
struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci);
kirin_pcie_sideband_dbi_w_mode(kirin_pcie, true);
kirin_pcie_sideband_dbi_w_mode(kirin_pcie, false);
struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci);
regmap_read(kirin_pcie->apb, PCIE_APB_PHY_STATUS0, &val);
struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci);
regmap_write(kirin_pcie->apb, PCIE_APP_LTSSM_ENABLE,
static int kirin_pcie_power_off(struct kirin_pcie *kirin_pcie)
if (kirin_pcie->type == PCIE_KIRIN_INTERNAL_PHY)
return hi3660_pcie_phy_power_off(kirin_pcie);
for (i = 0; i < kirin_pcie->n_gpio_clkreq; i++)
gpiod_direction_output_raw(kirin_pcie->id_clkreq_gpio[i], 1);
phy_power_off(kirin_pcie->phy);
phy_exit(kirin_pcie->phy);
struct kirin_pcie *kirin_pcie)
if (kirin_pcie->type == PCIE_KIRIN_INTERNAL_PHY) {
ret = hi3660_pcie_phy_init(pdev, kirin_pcie);
ret = hi3660_pcie_phy_power_on(kirin_pcie);
kirin_pcie->phy = devm_of_phy_get(dev, dev->of_node, NULL);
if (IS_ERR(kirin_pcie->phy))
return PTR_ERR(kirin_pcie->phy);
ret = phy_init(kirin_pcie->phy);
ret = phy_power_on(kirin_pcie->phy);
ret = gpiod_direction_output_raw(kirin_pcie->id_dwc_perst_gpio, 1);
kirin_pcie_power_off(kirin_pcie);
struct kirin_pcie *kirin_pcie = platform_get_drvdata(pdev);
dw_pcie_host_deinit(&kirin_pcie->pci->pp);
kirin_pcie_power_off(kirin_pcie);
struct kirin_pcie *kirin_pcie;
kirin_pcie = devm_kzalloc(dev, sizeof(struct kirin_pcie), GFP_KERNEL);
if (!kirin_pcie)
kirin_pcie->pci = pci;
kirin_pcie->type = data->phy_type;
ret = kirin_pcie_get_resource(kirin_pcie, pdev);
platform_set_drvdata(pdev, kirin_pcie);
ret = kirin_pcie_power_on(pdev, kirin_pcie);