Merge tag 'pci-v6.6-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci
[platform/kernel/linux-starfive.git] / drivers / pci / controller / dwc / pcie-designware.h
index 79713ce..ef0b2ef 100644 (file)
@@ -288,10 +288,21 @@ enum dw_pcie_core_rst {
        DW_PCIE_NUM_CORE_RSTS
 };
 
+enum dw_pcie_ltssm {
+       /* Need to align with PCIE_PORT_DEBUG0 bits 0:5 */
+       DW_PCIE_LTSSM_DETECT_QUIET = 0x0,
+       DW_PCIE_LTSSM_DETECT_ACT = 0x1,
+       DW_PCIE_LTSSM_L0 = 0x11,
+       DW_PCIE_LTSSM_L2_IDLE = 0x15,
+
+       DW_PCIE_LTSSM_UNKNOWN = 0xFFFFFFFF,
+};
+
 struct dw_pcie_host_ops {
        int (*host_init)(struct dw_pcie_rp *pp);
        void (*host_deinit)(struct dw_pcie_rp *pp);
        int (*msi_host_init)(struct dw_pcie_rp *pp);
+       void (*pme_turn_off)(struct dw_pcie_rp *pp);
 };
 
 struct dw_pcie_rp {
@@ -364,6 +375,7 @@ struct dw_pcie_ops {
        void    (*write_dbi2)(struct dw_pcie *pcie, void __iomem *base, u32 reg,
                              size_t size, u32 val);
        int     (*link_up)(struct dw_pcie *pcie);
+       enum dw_pcie_ltssm (*get_ltssm)(struct dw_pcie *pcie);
        int     (*start_link)(struct dw_pcie *pcie);
        void    (*stop_link)(struct dw_pcie *pcie);
 };
@@ -393,6 +405,7 @@ struct dw_pcie {
        struct reset_control_bulk_data  app_rsts[DW_PCIE_NUM_APP_RSTS];
        struct reset_control_bulk_data  core_rsts[DW_PCIE_NUM_CORE_RSTS];
        struct gpio_desc                *pe_rst;
+       bool                    suspended;
 };
 
 #define to_dw_pcie_from_pp(port) container_of((port), struct dw_pcie, pp)
@@ -430,6 +443,9 @@ void dw_pcie_iatu_detect(struct dw_pcie *pci);
 int dw_pcie_edma_detect(struct dw_pcie *pci);
 void dw_pcie_edma_remove(struct dw_pcie *pci);
 
+int dw_pcie_suspend_noirq(struct dw_pcie *pci);
+int dw_pcie_resume_noirq(struct dw_pcie *pci);
+
 static inline void dw_pcie_writel_dbi(struct dw_pcie *pci, u32 reg, u32 val)
 {
        dw_pcie_write_dbi(pci, reg, 0x4, val);
@@ -501,6 +517,18 @@ static inline void dw_pcie_stop_link(struct dw_pcie *pci)
                pci->ops->stop_link(pci);
 }
 
+static inline enum dw_pcie_ltssm dw_pcie_get_ltssm(struct dw_pcie *pci)
+{
+       u32 val;
+
+       if (pci->ops && pci->ops->get_ltssm)
+               return pci->ops->get_ltssm(pci);
+
+       val = dw_pcie_readl_dbi(pci, PCIE_PORT_DEBUG0);
+
+       return (enum dw_pcie_ltssm)FIELD_GET(PORT_LOGIC_LTSSM_STATE_MASK, val);
+}
+
 #ifdef CONFIG_PCIE_DW_HOST
 irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp);
 int dw_pcie_setup_rc(struct dw_pcie_rp *pp);