PCI: kirin: Use regmap for APB registers
The PHY layer need to access APB registers too, for Kirin 970. So place them into a named regmap. Link: https://lore.kernel.org/r/daf0e4bda5a69a5ac8484e70f09351a959805c8c.1634812676.git.mchehab+huawei@kernel.org Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Xiaowei Song <songxiaowei@hisilicon.com>
This commit is contained in:
parent
000f60db78
commit
d19afe7be1
1 changed files with 26 additions and 23 deletions
|
@ -61,8 +61,8 @@ struct kirin_pcie {
|
||||||
enum pcie_kirin_phy_type type;
|
enum pcie_kirin_phy_type type;
|
||||||
|
|
||||||
struct dw_pcie *pci;
|
struct dw_pcie *pci;
|
||||||
|
struct regmap *apb;
|
||||||
struct phy *phy;
|
struct phy *phy;
|
||||||
void __iomem *apb_base;
|
|
||||||
void *phy_priv; /* only for PCIE_KIRIN_INTERNAL_PHY */
|
void *phy_priv; /* only for PCIE_KIRIN_INTERNAL_PHY */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -340,25 +340,27 @@ static int hi3660_pcie_phy_init(struct platform_device *pdev,
|
||||||
* The non-PHY part starts here
|
* The non-PHY part starts here
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Registers in PCIeCTRL */
|
static const struct regmap_config pcie_kirin_regmap_conf = {
|
||||||
static inline void kirin_apb_ctrl_writel(struct kirin_pcie *kirin_pcie,
|
.name = "kirin_pcie_apb",
|
||||||
u32 val, u32 reg)
|
.reg_bits = 32,
|
||||||
{
|
.val_bits = 32,
|
||||||
writel(val, kirin_pcie->apb_base + reg);
|
.reg_stride = 4,
|
||||||
}
|
};
|
||||||
|
|
||||||
static inline u32 kirin_apb_ctrl_readl(struct kirin_pcie *kirin_pcie, u32 reg)
|
|
||||||
{
|
|
||||||
return readl(kirin_pcie->apb_base + reg);
|
|
||||||
}
|
|
||||||
|
|
||||||
static long kirin_pcie_get_resource(struct kirin_pcie *kirin_pcie,
|
static long kirin_pcie_get_resource(struct kirin_pcie *kirin_pcie,
|
||||||
struct platform_device *pdev)
|
struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
kirin_pcie->apb_base =
|
struct device *dev = &pdev->dev;
|
||||||
devm_platform_ioremap_resource_byname(pdev, "apb");
|
void __iomem *apb_base;
|
||||||
if (IS_ERR(kirin_pcie->apb_base))
|
|
||||||
return PTR_ERR(kirin_pcie->apb_base);
|
apb_base = devm_platform_ioremap_resource_byname(pdev, "apb");
|
||||||
|
if (IS_ERR(apb_base))
|
||||||
|
return PTR_ERR(apb_base);
|
||||||
|
|
||||||
|
kirin_pcie->apb = devm_regmap_init_mmio(dev, apb_base,
|
||||||
|
&pcie_kirin_regmap_conf);
|
||||||
|
if (IS_ERR(kirin_pcie->apb))
|
||||||
|
return PTR_ERR(kirin_pcie->apb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -368,13 +370,13 @@ static void kirin_pcie_sideband_dbi_w_mode(struct kirin_pcie *kirin_pcie,
|
||||||
{
|
{
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
val = kirin_apb_ctrl_readl(kirin_pcie, SOC_PCIECTRL_CTRL0_ADDR);
|
regmap_read(kirin_pcie->apb, SOC_PCIECTRL_CTRL0_ADDR, &val);
|
||||||
if (on)
|
if (on)
|
||||||
val = val | PCIE_ELBI_SLV_DBI_ENABLE;
|
val = val | PCIE_ELBI_SLV_DBI_ENABLE;
|
||||||
else
|
else
|
||||||
val = val & ~PCIE_ELBI_SLV_DBI_ENABLE;
|
val = val & ~PCIE_ELBI_SLV_DBI_ENABLE;
|
||||||
|
|
||||||
kirin_apb_ctrl_writel(kirin_pcie, val, SOC_PCIECTRL_CTRL0_ADDR);
|
regmap_write(kirin_pcie->apb, SOC_PCIECTRL_CTRL0_ADDR, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void kirin_pcie_sideband_dbi_r_mode(struct kirin_pcie *kirin_pcie,
|
static void kirin_pcie_sideband_dbi_r_mode(struct kirin_pcie *kirin_pcie,
|
||||||
|
@ -382,13 +384,13 @@ static void kirin_pcie_sideband_dbi_r_mode(struct kirin_pcie *kirin_pcie,
|
||||||
{
|
{
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
val = kirin_apb_ctrl_readl(kirin_pcie, SOC_PCIECTRL_CTRL1_ADDR);
|
regmap_read(kirin_pcie->apb, SOC_PCIECTRL_CTRL1_ADDR, &val);
|
||||||
if (on)
|
if (on)
|
||||||
val = val | PCIE_ELBI_SLV_DBI_ENABLE;
|
val = val | PCIE_ELBI_SLV_DBI_ENABLE;
|
||||||
else
|
else
|
||||||
val = val & ~PCIE_ELBI_SLV_DBI_ENABLE;
|
val = val & ~PCIE_ELBI_SLV_DBI_ENABLE;
|
||||||
|
|
||||||
kirin_apb_ctrl_writel(kirin_pcie, val, SOC_PCIECTRL_CTRL1_ADDR);
|
regmap_write(kirin_pcie->apb, SOC_PCIECTRL_CTRL1_ADDR, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int kirin_pcie_rd_own_conf(struct pci_bus *bus, unsigned int devfn,
|
static int kirin_pcie_rd_own_conf(struct pci_bus *bus, unsigned int devfn,
|
||||||
|
@ -448,8 +450,9 @@ static void kirin_pcie_write_dbi(struct dw_pcie *pci, void __iomem *base,
|
||||||
static int kirin_pcie_link_up(struct dw_pcie *pci)
|
static int kirin_pcie_link_up(struct dw_pcie *pci)
|
||||||
{
|
{
|
||||||
struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci);
|
struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci);
|
||||||
u32 val = kirin_apb_ctrl_readl(kirin_pcie, PCIE_APB_PHY_STATUS0);
|
u32 val;
|
||||||
|
|
||||||
|
regmap_read(kirin_pcie->apb, PCIE_APB_PHY_STATUS0, &val);
|
||||||
if ((val & PCIE_LINKUP_ENABLE) == PCIE_LINKUP_ENABLE)
|
if ((val & PCIE_LINKUP_ENABLE) == PCIE_LINKUP_ENABLE)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -461,8 +464,8 @@ static int kirin_pcie_start_link(struct dw_pcie *pci)
|
||||||
struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci);
|
struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci);
|
||||||
|
|
||||||
/* assert LTSSM enable */
|
/* assert LTSSM enable */
|
||||||
kirin_apb_ctrl_writel(kirin_pcie, PCIE_LTSSM_ENABLE_BIT,
|
regmap_write(kirin_pcie->apb, PCIE_APP_LTSSM_ENABLE,
|
||||||
PCIE_APP_LTSSM_ENABLE);
|
PCIE_LTSSM_ENABLE_BIT);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue