kernel: bump 4.19 to 4.19.88
[openwrt/openwrt.git] / target / linux / mediatek / patches-4.19 / 0101-pci-mediatek-backport-fix-pcie.patch
index bf7c1ea32bb7b280f07ed9a952696b2872ab16b5..d4c4ea773859986285544e493a8a2c178b3599cb 100644 (file)
@@ -1,7 +1,6 @@
-diff -urN a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c
---- a/drivers/clk/clk-devres.c 2019-08-29 16:59:26.540010395 +0800
-+++ b/drivers/clk/clk-devres.c 2019-08-29 17:02:09.215924786 +0800
-@@ -34,6 +34,17 @@
+--- a/drivers/clk/clk-devres.c
++++ b/drivers/clk/clk-devres.c
+@@ -34,6 +34,17 @@ struct clk *devm_clk_get(struct device *
  }
  EXPORT_SYMBOL(devm_clk_get);
  
@@ -19,9 +18,8 @@ diff -urN a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c
  struct clk_bulk_devres {
        struct clk_bulk_data *clks;
        int num_clks;
-diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
---- a/drivers/pci/controller/pcie-mediatek.c   2019-08-29 16:59:10.520410188 +0800
-+++ b/drivers/pci/controller/pcie-mediatek.c   2019-08-29 17:01:58.340199243 +0800
+--- a/drivers/pci/controller/pcie-mediatek.c
++++ b/drivers/pci/controller/pcie-mediatek.c
 @@ -15,6 +15,7 @@
  #include <linux/irqdomain.h>
  #include <linux/kernel.h>
@@ -30,7 +28,7 @@ diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie
  #include <linux/of_address.h>
  #include <linux/of_pci.h>
  #include <linux/of_platform.h>
-@@ -162,6 +163,7 @@
+@@ -162,6 +163,7 @@ struct mtk_pcie_soc {
   * @phy: pointer to PHY control block
   * @lane: lane count
   * @slot: port slot
@@ -38,7 +36,7 @@ diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie
   * @irq_domain: legacy INTx IRQ domain
   * @inner_domain: inner IRQ domain
   * @msi_domain: MSI IRQ domain
-@@ -182,6 +184,7 @@
+@@ -182,6 +184,7 @@ struct mtk_pcie_port {
        struct phy *phy;
        u32 lane;
        u32 slot;
@@ -46,7 +44,7 @@ diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie
        struct irq_domain *irq_domain;
        struct irq_domain *inner_domain;
        struct irq_domain *msi_domain;
-@@ -225,10 +228,8 @@
+@@ -225,10 +228,8 @@ static void mtk_pcie_subsys_powerdown(st
  
        clk_disable_unprepare(pcie->free_ck);
  
@@ -59,83 +57,7 @@ diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie
  }
  
  static void mtk_pcie_port_free(struct mtk_pcie_port *port)
-@@ -394,75 +395,6 @@
-       .write = mtk_pcie_config_write,
- };
--static int mtk_pcie_startup_port_v2(struct mtk_pcie_port *port)
--{
--      struct mtk_pcie *pcie = port->pcie;
--      struct resource *mem = &pcie->mem;
--      const struct mtk_pcie_soc *soc = port->pcie->soc;
--      u32 val;
--      size_t size;
--      int err;
--
--      /* MT7622 platforms need to enable LTSSM and ASPM from PCIe subsys */
--      if (pcie->base) {
--              val = readl(pcie->base + PCIE_SYS_CFG_V2);
--              val |= PCIE_CSR_LTSSM_EN(port->slot) |
--                     PCIE_CSR_ASPM_L1_EN(port->slot);
--              writel(val, pcie->base + PCIE_SYS_CFG_V2);
--      }
--
--      /* Assert all reset signals */
--      writel(0, port->base + PCIE_RST_CTRL);
--
--      /*
--       * Enable PCIe link down reset, if link status changed from link up to
--       * link down, this will reset MAC control registers and configuration
--       * space.
--       */
--      writel(PCIE_LINKDOWN_RST_EN, port->base + PCIE_RST_CTRL);
--
--      /* De-assert PHY, PE, PIPE, MAC and configuration reset */
--      val = readl(port->base + PCIE_RST_CTRL);
--      val |= PCIE_PHY_RSTB | PCIE_PERSTB | PCIE_PIPE_SRSTB |
--             PCIE_MAC_SRSTB | PCIE_CRSTB;
--      writel(val, port->base + PCIE_RST_CTRL);
--
--      /* Set up vendor ID and class code */
--      if (soc->need_fix_class_id) {
--              val = PCI_VENDOR_ID_MEDIATEK;
--              writew(val, port->base + PCIE_CONF_VEND_ID);
--
--              val = PCI_CLASS_BRIDGE_HOST;
--              writew(val, port->base + PCIE_CONF_CLASS_ID);
--      }
--
--      /* 100ms timeout value should be enough for Gen1/2 training */
--      err = readl_poll_timeout(port->base + PCIE_LINK_STATUS_V2, val,
--                               !!(val & PCIE_PORT_LINKUP_V2), 20,
--                               100 * USEC_PER_MSEC);
--      if (err)
--              return -ETIMEDOUT;
--
--      /* Set INTx mask */
--      val = readl(port->base + PCIE_INT_MASK);
--      val &= ~INTX_MASK;
--      writel(val, port->base + PCIE_INT_MASK);
--
--      /* Set AHB to PCIe translation windows */
--      size = mem->end - mem->start;
--      val = lower_32_bits(mem->start) | AHB2PCIE_SIZE(fls(size));
--      writel(val, port->base + PCIE_AHB_TRANS_BASE0_L);
--
--      val = upper_32_bits(mem->start);
--      writel(val, port->base + PCIE_AHB_TRANS_BASE0_H);
--
--      /* Set PCIe to AXI translation memory space.*/
--      val = fls(0xffffffff) | WIN_ENABLE;
--      writel(val, port->base + PCIE_AXI_WINDOW0);
--
--      return 0;
--}
--
- static void mtk_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
- {
-       struct mtk_pcie_port *port = irq_data_get_irq_chip_data(data);
-@@ -601,6 +533,27 @@
+@@ -532,6 +533,27 @@ static void mtk_pcie_enable_msi(struct m
        writel(val, port->base + PCIE_INT_MASK);
  }
  
@@ -163,7 +85,7 @@ diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie
  static int mtk_pcie_intx_map(struct irq_domain *domain, unsigned int irq,
                             irq_hw_number_t hwirq)
  {
-@@ -630,6 +583,7 @@
+@@ -561,6 +583,7 @@ static int mtk_pcie_init_irq_domain(stru
  
        port->irq_domain = irq_domain_add_linear(pcie_intc_node, PCI_NUM_INTX,
                                                 &intx_domain_ops, port);
@@ -171,16 +93,7 @@ diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie
        if (!port->irq_domain) {
                dev_err(dev, "failed to get INTx IRQ domain\n");
                return -ENODEV;
-@@ -639,8 +593,6 @@
-               ret = mtk_pcie_allocate_msi_domains(port);
-               if (ret)
-                       return ret;
--
--              mtk_pcie_enable_msi(port);
-       }
-       return 0;
-@@ -693,7 +645,7 @@
+@@ -622,7 +645,7 @@ static int mtk_pcie_setup_irq(struct mtk
        struct mtk_pcie *pcie = port->pcie;
        struct device *dev = pcie->dev;
        struct platform_device *pdev = to_platform_device(dev);
@@ -189,7 +102,7 @@ diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie
  
        err = mtk_pcie_init_irq_domain(port, node);
        if (err) {
-@@ -701,8 +653,81 @@
+@@ -630,8 +653,9 @@ static int mtk_pcie_setup_irq(struct mtk
                return err;
        }
  
@@ -198,82 +111,10 @@ diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie
 +      port->irq = platform_get_irq(pdev, port->slot);
 +      irq_set_chained_handler_and_data(port->irq,
 +                                       mtk_pcie_intr_handler, port);
-+
-+      return 0;
-+}
-+
-+static int mtk_pcie_startup_port_v2(struct mtk_pcie_port *port)
-+{
-+      struct mtk_pcie *pcie = port->pcie;
-+      struct resource *mem = &pcie->mem;
-+      const struct mtk_pcie_soc *soc = port->pcie->soc;
-+      u32 val;
-+      size_t size;
-+      int err;
-+
-+      /* MT7622 platforms need to enable LTSSM and ASPM from PCIe subsys */
-+      if (pcie->base) {
-+              val = readl(pcie->base + PCIE_SYS_CFG_V2);
-+              val |= PCIE_CSR_LTSSM_EN(port->slot) |
-+                     PCIE_CSR_ASPM_L1_EN(port->slot);
-+              writel(val, pcie->base + PCIE_SYS_CFG_V2);
-+      }
-+
-+      /* Assert all reset signals */
-+      writel(0, port->base + PCIE_RST_CTRL);
-+
-+      /*
-+       * Enable PCIe link down reset, if link status changed from link up to
-+       * link down, this will reset MAC control registers and configuration
-+       * space.
-+       */
-+      writel(PCIE_LINKDOWN_RST_EN, port->base + PCIE_RST_CTRL);
-+
-+      /* De-assert PHY, PE, PIPE, MAC and configuration reset */
-+      val = readl(port->base + PCIE_RST_CTRL);
-+      val |= PCIE_PHY_RSTB | PCIE_PERSTB | PCIE_PIPE_SRSTB |
-+             PCIE_MAC_SRSTB | PCIE_CRSTB;
-+      writel(val, port->base + PCIE_RST_CTRL);
-+
-+      /* Set up vendor ID and class code */
-+      if (soc->need_fix_class_id) {
-+              val = PCI_VENDOR_ID_MEDIATEK;
-+              writew(val, port->base + PCIE_CONF_VEND_ID);
-+
-+              val = PCI_CLASS_BRIDGE_PCI;
-+              writew(val, port->base + PCIE_CONF_CLASS_ID);
-+      }
-+
-+      /* 100ms timeout value should be enough for Gen1/2 training */
-+      err = readl_poll_timeout(port->base + PCIE_LINK_STATUS_V2, val,
-+                               !!(val & PCIE_PORT_LINKUP_V2), 20,
-+                               100 * USEC_PER_MSEC);
-+      if (err)
-+              return -ETIMEDOUT;
-+
-+      /* Set INTx mask */
-+      val = readl(port->base + PCIE_INT_MASK);
-+      val &= ~INTX_MASK;
-+      writel(val, port->base + PCIE_INT_MASK);
-+
-+      if (IS_ENABLED(CONFIG_PCI_MSI))
-+              mtk_pcie_enable_msi(port);
-+
-+      /* Set AHB to PCIe translation windows */
-+      size = mem->end - mem->start;
-+      val = lower_32_bits(mem->start) | AHB2PCIE_SIZE(fls(size));
-+      writel(val, port->base + PCIE_AHB_TRANS_BASE0_L);
-+
-+      val = upper_32_bits(mem->start);
-+      writel(val, port->base + PCIE_AHB_TRANS_BASE0_H);
-+
-+      /* Set PCIe to AXI translation memory space.*/
-+      val = fls(0xffffffff) | WIN_ENABLE;
-+      writel(val, port->base + PCIE_AXI_WINDOW0);
  
        return 0;
  }
-@@ -903,49 +928,29 @@
+@@ -904,49 +928,29 @@ static int mtk_pcie_parse_port(struct mt
  
        /* sys_ck might be divided into the following parts in some chips */
        snprintf(name, sizeof(name), "ahb_ck%d", slot);
@@ -338,7 +179,7 @@ diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie
  
        snprintf(name, sizeof(name), "pcie-rst%d", slot);
        port->reset = devm_reset_control_get_optional_exclusive(dev, name);
-@@ -998,10 +1003,8 @@
+@@ -999,10 +1003,8 @@ static int mtk_pcie_subsys_powerup(struc
                pcie->free_ck = NULL;
        }
  
@@ -351,7 +192,7 @@ diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie
  
        /* enable top level clock */
        err = clk_prepare_enable(pcie->free_ck);
-@@ -1013,10 +1016,8 @@
+@@ -1014,10 +1016,8 @@ static int mtk_pcie_subsys_powerup(struc
        return 0;
  
  err_free_ck:
@@ -364,10 +205,16 @@ diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie
  
        return err;
  }
-@@ -1125,34 +1126,6 @@
-       return 0;
- }
+@@ -1122,36 +1122,6 @@ static int mtk_pcie_request_resources(st
+               return err;
  
+       err = devm_pci_remap_iospace(dev, &pcie->pio, pcie->io.start);
+-      if (err)
+-              return err;
+-
+-      return 0;
+-}
+-
 -static int mtk_pcie_register_host(struct pci_host_bridge *host)
 -{
 -      struct mtk_pcie *pcie = pci_host_bridge_priv(host);
@@ -392,14 +239,10 @@ diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie
 -              pcie_bus_configure_settings(child);
 -
 -      pci_bus_add_devices(host->bus);
--
--      return 0;
--}
--
- static int mtk_pcie_probe(struct platform_device *pdev)
- {
-       struct device *dev = &pdev->dev;
-@@ -1179,7 +1152,14 @@
+       return 0;
+ }
+@@ -1182,7 +1152,14 @@ static int mtk_pcie_probe(struct platfor
        if (err)
                goto put_resources;
  
@@ -415,7 +258,7 @@ diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie
        if (err)
                goto put_resources;
  
-@@ -1192,6 +1172,80 @@
+@@ -1195,6 +1172,80 @@ put_resources:
        return err;
  }
  
@@ -496,7 +339,7 @@ diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie
  static const struct mtk_pcie_soc mtk_pcie_soc_v1 = {
        .ops = &mtk_pcie_ops,
        .startup = mtk_pcie_startup_port,
-@@ -1220,10 +1274,13 @@
+@@ -1223,10 +1274,13 @@ static const struct of_device_id mtk_pci
  
  static struct platform_driver mtk_pcie_driver = {
        .probe = mtk_pcie_probe,
@@ -511,10 +354,9 @@ diff -urN a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie
 -builtin_platform_driver(mtk_pcie_driver);
 +module_platform_driver(mtk_pcie_driver);
 +MODULE_LICENSE("GPL v2");
-diff -urN a/include/linux/clk.h b/include/linux/clk.h
---- a/include/linux/clk.h      2019-08-29 16:59:52.335365591 +0800
-+++ b/include/linux/clk.h      2019-08-29 17:02:17.107725525 +0800
-@@ -349,6 +349,17 @@
+--- a/include/linux/clk.h
++++ b/include/linux/clk.h
+@@ -349,6 +349,17 @@ int __must_check devm_clk_bulk_get(struc
  struct clk *devm_clk_get(struct device *dev, const char *id);
  
  /**