mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
PCI: brcmstb: Add DT property to control L1SS
The BRCM PCIe block has controls to enable control of the CLKREQ# signal by the L1SS, and to gate the refclk with the CLKREQ# input. These controls are mutually exclusive - the upstream code sets the latter, but some use cases require the former. Add a Device Tree property - brcm,enable-l1ss - to switch to the L1SS configuration. Signed-off-by: Phil Elwell <phil@raspberrypi.com>
This commit is contained in:
@@ -116,8 +116,9 @@
|
|||||||
PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LIMIT_HI + ((win) * 8)
|
PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LIMIT_HI + ((win) * 8)
|
||||||
|
|
||||||
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG 0x4204
|
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG 0x4204
|
||||||
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_DEBUG_ENABLE_MASK 0x2
|
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_DEBUG_ENABLE_MASK BIT(1)
|
||||||
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK 0x08000000
|
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_L1SS_ENABLE_MASK BIT(21)
|
||||||
|
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK BIT(27)
|
||||||
|
|
||||||
|
|
||||||
#define PCIE_INTR2_CPU_BASE 0x4300
|
#define PCIE_INTR2_CPU_BASE 0x4300
|
||||||
@@ -283,6 +284,7 @@ struct brcm_pcie {
|
|||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
struct device_node *np;
|
struct device_node *np;
|
||||||
bool ssc;
|
bool ssc;
|
||||||
|
bool l1ss;
|
||||||
int gen;
|
int gen;
|
||||||
u64 msi_target_addr;
|
u64 msi_target_addr;
|
||||||
struct brcm_msi *msi;
|
struct brcm_msi *msi;
|
||||||
@@ -1034,12 +1036,25 @@ static int brcm_pcie_setup(struct brcm_pcie *pcie)
|
|||||||
PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1_ENDIAN_MODE_BAR2_MASK);
|
PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1_ENDIAN_MODE_BAR2_MASK);
|
||||||
writel(tmp, base + PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1);
|
writel(tmp, base + PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1);
|
||||||
|
|
||||||
/*
|
|
||||||
* Refclk from RC should be gated with CLKREQ# input when ASPM L0s,L1
|
|
||||||
* is enabled => setting the CLKREQ_DEBUG_ENABLE field to 1.
|
|
||||||
*/
|
|
||||||
tmp = readl(base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
|
tmp = readl(base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
|
||||||
tmp |= PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_DEBUG_ENABLE_MASK;
|
if (pcie->l1ss) {
|
||||||
|
/*
|
||||||
|
* Enable CLKREQ# signalling include L1 Substate control of
|
||||||
|
* the CLKREQ# signal and the external reference clock buffer.
|
||||||
|
* meet requirement for Endpoints that require CLKREQ#
|
||||||
|
* assertion to clock active within 400ns.
|
||||||
|
*/
|
||||||
|
tmp &= ~PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_DEBUG_ENABLE_MASK;
|
||||||
|
tmp |= PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_L1SS_ENABLE_MASK;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Refclk from RC should be gated with CLKREQ# input when
|
||||||
|
* ASPM L0s,L1 is enabled => setting the CLKREQ_DEBUG_ENABLE
|
||||||
|
* field to 1.
|
||||||
|
*/
|
||||||
|
tmp &= ~PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_L1SS_ENABLE_MASK;
|
||||||
|
tmp |= PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_DEBUG_ENABLE_MASK;
|
||||||
|
}
|
||||||
writel(tmp, base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
|
writel(tmp, base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1268,6 +1283,7 @@ static int brcm_pcie_probe(struct platform_device *pdev)
|
|||||||
pcie->gen = (ret < 0) ? 0 : ret;
|
pcie->gen = (ret < 0) ? 0 : ret;
|
||||||
|
|
||||||
pcie->ssc = of_property_read_bool(np, "brcm,enable-ssc");
|
pcie->ssc = of_property_read_bool(np, "brcm,enable-ssc");
|
||||||
|
pcie->l1ss = of_property_read_bool(np, "brcm,enable-l1ss");
|
||||||
|
|
||||||
ret = clk_prepare_enable(pcie->clk);
|
ret = clk_prepare_enable(pcie->clk);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|||||||
Reference in New Issue
Block a user