Lines Matching refs:kirin_pcie
81 struct kirin_pcie { struct
96 static inline void kirin_apb_ctrl_writel(struct kirin_pcie *kirin_pcie, in kirin_apb_ctrl_writel() argument
99 writel(val, kirin_pcie->apb_base + reg); in kirin_apb_ctrl_writel()
102 static inline u32 kirin_apb_ctrl_readl(struct kirin_pcie *kirin_pcie, u32 reg) in kirin_apb_ctrl_readl() argument
104 return readl(kirin_pcie->apb_base + reg); in kirin_apb_ctrl_readl()
108 static inline void kirin_apb_phy_writel(struct kirin_pcie *kirin_pcie, in kirin_apb_phy_writel() argument
111 writel(val, kirin_pcie->phy_base + reg); in kirin_apb_phy_writel()
114 static inline u32 kirin_apb_phy_readl(struct kirin_pcie *kirin_pcie, u32 reg) in kirin_apb_phy_readl() argument
116 return readl(kirin_pcie->phy_base + reg); in kirin_apb_phy_readl()
119 static long kirin_pcie_get_clk(struct kirin_pcie *kirin_pcie, in kirin_pcie_get_clk() argument
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()
147 static long kirin_pcie_get_resource(struct kirin_pcie *kirin_pcie, in kirin_pcie_get_resource() argument
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()
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()
172 if (IS_ERR(kirin_pcie->sysctrl)) in kirin_pcie_get_resource()
173 return PTR_ERR(kirin_pcie->sysctrl); in kirin_pcie_get_resource()
178 static int kirin_pcie_phy_init(struct kirin_pcie *kirin_pcie) in kirin_pcie_phy_init() argument
180 struct device *dev = kirin_pcie->pci->dev; in kirin_pcie_phy_init()
183 reg_val = kirin_apb_phy_readl(kirin_pcie, PCIE_APB_PHY_CTRL1); in kirin_pcie_phy_init()
185 kirin_apb_phy_writel(kirin_pcie, reg_val, PCIE_APB_PHY_CTRL1); in kirin_pcie_phy_init()
187 reg_val = kirin_apb_phy_readl(kirin_pcie, PCIE_APB_PHY_CTRL0); in kirin_pcie_phy_init()
189 kirin_apb_phy_writel(kirin_pcie, reg_val, PCIE_APB_PHY_CTRL0); in kirin_pcie_phy_init()
192 reg_val = kirin_apb_phy_readl(kirin_pcie, PCIE_APB_PHY_CTRL1); in kirin_pcie_phy_init()
194 kirin_apb_phy_writel(kirin_pcie, reg_val, PCIE_APB_PHY_CTRL1); in kirin_pcie_phy_init()
197 reg_val = kirin_apb_phy_readl(kirin_pcie, PCIE_APB_PHY_STATUS0); in kirin_pcie_phy_init()
206 static void kirin_pcie_oe_enable(struct kirin_pcie *kirin_pcie) in kirin_pcie_oe_enable() argument
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()
216 static int kirin_pcie_clk_ctrl(struct kirin_pcie *kirin_pcie, bool enable) in kirin_pcie_clk_ctrl() argument
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()
263 static int kirin_pcie_power_on(struct kirin_pcie *kirin_pcie) in kirin_pcie_power_on() argument
268 regmap_write(kirin_pcie->sysctrl, in kirin_pcie_power_on()
271 kirin_pcie_oe_enable(kirin_pcie); in kirin_pcie_power_on()
273 ret = kirin_pcie_clk_ctrl(kirin_pcie, true); 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()
285 ret = kirin_pcie_phy_init(kirin_pcie); 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()
301 kirin_pcie_clk_ctrl(kirin_pcie, false); in kirin_pcie_power_on()
305 static void kirin_pcie_sideband_dbi_w_mode(struct kirin_pcie *kirin_pcie, in kirin_pcie_sideband_dbi_w_mode() argument
310 val = kirin_apb_ctrl_readl(kirin_pcie, SOC_PCIECTRL_CTRL0_ADDR); in kirin_pcie_sideband_dbi_w_mode()
316 kirin_apb_ctrl_writel(kirin_pcie, val, SOC_PCIECTRL_CTRL0_ADDR); in kirin_pcie_sideband_dbi_w_mode()
319 static void kirin_pcie_sideband_dbi_r_mode(struct kirin_pcie *kirin_pcie, in kirin_pcie_sideband_dbi_r_mode() argument
324 val = kirin_apb_ctrl_readl(kirin_pcie, SOC_PCIECTRL_CTRL1_ADDR); in kirin_pcie_sideband_dbi_r_mode()
330 kirin_apb_ctrl_writel(kirin_pcie, val, SOC_PCIECTRL_CTRL1_ADDR); in kirin_pcie_sideband_dbi_r_mode()
367 struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci); in kirin_pcie_read_dbi() local
370 kirin_pcie_sideband_dbi_r_mode(kirin_pcie, true); in kirin_pcie_read_dbi()
372 kirin_pcie_sideband_dbi_r_mode(kirin_pcie, false); in kirin_pcie_read_dbi()
380 struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci); in kirin_pcie_write_dbi() local
382 kirin_pcie_sideband_dbi_w_mode(kirin_pcie, true); in kirin_pcie_write_dbi()
384 kirin_pcie_sideband_dbi_w_mode(kirin_pcie, false); in kirin_pcie_write_dbi()
389 struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci); in kirin_pcie_link_up() local
390 u32 val = kirin_apb_ctrl_readl(kirin_pcie, PCIE_APB_PHY_STATUS0); in kirin_pcie_link_up()
401 struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci); in kirin_pcie_establish_link() local
402 struct device *dev = kirin_pcie->pci->dev; in kirin_pcie_establish_link()
411 kirin_apb_ctrl_writel(kirin_pcie, PCIE_LTSSM_ENABLE_BIT, in kirin_pcie_establish_link()
480 struct kirin_pcie *kirin_pcie; in kirin_pcie_probe() local
489 kirin_pcie = devm_kzalloc(dev, sizeof(struct kirin_pcie), GFP_KERNEL); in kirin_pcie_probe()
490 if (!kirin_pcie) in kirin_pcie_probe()
499 kirin_pcie->pci = pci; in kirin_pcie_probe()
501 ret = kirin_pcie_get_clk(kirin_pcie, pdev); in kirin_pcie_probe()
505 ret = kirin_pcie_get_resource(kirin_pcie, pdev); in kirin_pcie_probe()
509 kirin_pcie->gpio_id_reset = of_get_named_gpio(dev->of_node, in kirin_pcie_probe()
511 if (kirin_pcie->gpio_id_reset == -EPROBE_DEFER) { in kirin_pcie_probe()
513 } else if (!gpio_is_valid(kirin_pcie->gpio_id_reset)) { in kirin_pcie_probe()
518 ret = kirin_pcie_power_on(kirin_pcie); in kirin_pcie_probe()
522 platform_set_drvdata(pdev, kirin_pcie); in kirin_pcie_probe()