Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1309311 > unrolled thread
| Started by | Kishon Vijay Abraham I <kishon@ti.com> |
|---|---|
| First post | 2016-01-14 15:20 +0100 |
| Last post | 2016-01-14 15:20 +0100 |
| Articles | 3 — 1 participant |
Back to article view | Back to linux.kernel
[PATCH v3 0/3] dra7xx: get pcie working in mainline Kishon Vijay Abraham I <kishon@ti.com> - 2016-01-14 15:20 +0100
[PATCH v3 3/3] pci: dra7xx: use pdata callbacks to perform reset Kishon Vijay Abraham I <kishon@ti.com> - 2016-01-14 15:20 +0100
[PATCH v3 1/3] ARM: DRA7: hwmod: Add reset data for PCIe Kishon Vijay Abraham I <kishon@ti.com> - 2016-01-14 15:20 +0100
| From | Kishon Vijay Abraham I <kishon@ti.com> |
|---|---|
| Date | 2016-01-14 15:20 +0100 |
| Subject | [PATCH v3 0/3] dra7xx: get pcie working in mainline |
| Message-ID | <qQQUO-8fS-13@gated-at.bofh.it> |
This series adds pdata-quirk mechanism to reset PCIe as a temporary fix till reset controller driver is added in mainline. Without this series, a stall is observed if pci dra7xx driver is enabled. Changes from v2: *) Now assert reset line during driver removal (will be useful when module insert/removal functionality is added) *) Added kernel-doc comments for pci_dra7xx_platform_data *) Better commit logs *) Misc cleanup Changes from v1: *) Removed 'HACK' from $subject *) removed reviewed-by Suman Kishon Vijay Abraham I (3): ARM: DRA7: hwmod: Add reset data for PCIe ARM: DRA7: add pdata-quirks to do reset of PCIe pci: dra7xx: use pdata callbacks to perform reset arch/arm/mach-omap2/omap_hwmod_7xx_data.c | 15 +++++++ arch/arm/mach-omap2/pdata-quirks.c | 11 +++++ arch/arm/mach-omap2/prm7xx.h | 1 + drivers/pci/host/pci-dra7xx.c | 66 +++++++++++++++++++++++++++++ include/linux/platform_data/pci-dra7xx.h | 29 +++++++++++++ 5 files changed, 122 insertions(+) create mode 100644 include/linux/platform_data/pci-dra7xx.h -- 1.7.9.5
[toc] | [next] | [standalone]
| From | Kishon Vijay Abraham I <kishon@ti.com> |
|---|---|
| Date | 2016-01-14 15:20 +0100 |
| Subject | [PATCH v3 3/3] pci: dra7xx: use pdata callbacks to perform reset |
| Message-ID | <qQQUP-8fS-37@gated-at.bofh.it> |
| In reply to | #1309311 |
Use assert/deassert callbacks populated in the platform data to
to perform reset of PCIe.
Use these callbacks until a reset controller driver is
is available in the kernel to reset PCIe.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Sekhar Nori <nsekhar@ti.com>
---
drivers/pci/host/pci-dra7xx.c | 66 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
diff --git a/drivers/pci/host/pci-dra7xx.c b/drivers/pci/host/pci-dra7xx.c
index 8c36880..f9a3240 100644
--- a/drivers/pci/host/pci-dra7xx.c
+++ b/drivers/pci/host/pci-dra7xx.c
@@ -25,6 +25,8 @@
#include <linux/resource.h>
#include <linux/types.h>
+#include <linux/platform_data/pci-dra7xx.h>
+
#include "pcie-designware.h"
/* PCIe controller wrapper DRA7XX configuration registers */
@@ -329,6 +331,61 @@ static int __init dra7xx_add_pcie_port(struct dra7xx_pcie *dra7xx,
return 0;
}
+static int dra7xx_pcie_assert_reset(struct platform_device *pdev)
+{
+ int ret;
+ struct device *dev = &pdev->dev;
+ struct pci_dra7xx_platform_data *pdata = pdev->dev.platform_data;
+
+ if (!(pdata && pdata->assert_reset)) {
+ dev_err(dev, "platform data for assert reset not found!\n");
+ return -EINVAL;
+ }
+
+ ret = pdata->assert_reset(pdev, pdata->reset_name);
+ if (ret) {
+ dev_err(dev, "assert_reset failed: %d\n", ret);
+ return ret;
+ }
+
+ return 0;
+}
+
+static int dra7xx_pcie_deassert_reset(struct platform_device *pdev)
+{
+ int ret;
+ struct device *dev = &pdev->dev;
+ struct pci_dra7xx_platform_data *pdata = pdev->dev.platform_data;
+
+ if (!(pdata && pdata->deassert_reset)) {
+ dev_err(dev, "platform data for deassert reset not found!\n");
+ return -EINVAL;
+ }
+
+ ret = pdata->deassert_reset(pdev, pdata->reset_name);
+ if (ret) {
+ dev_err(dev, "deassert_reset failed: %d\n", ret);
+ return ret;
+ }
+
+ return 0;
+}
+
+static int dra7xx_pcie_reset(struct platform_device *pdev)
+{
+ int ret;
+
+ ret = dra7xx_pcie_assert_reset(pdev);
+ if (ret < 0)
+ return ret;
+
+ ret = dra7xx_pcie_deassert_reset(pdev);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+}
+
static int __init dra7xx_pcie_probe(struct platform_device *pdev)
{
u32 reg;
@@ -347,6 +404,10 @@ static int __init dra7xx_pcie_probe(struct platform_device *pdev)
enum of_gpio_flags flags;
unsigned long gpio_flags;
+ ret = dra7xx_pcie_reset(pdev);
+ if (ret)
+ return ret;
+
dra7xx = devm_kzalloc(dev, sizeof(*dra7xx), GFP_KERNEL);
if (!dra7xx)
return -ENOMEM;
@@ -457,6 +518,7 @@ static int __exit dra7xx_pcie_remove(struct platform_device *pdev)
struct pcie_port *pp = &dra7xx->pp;
struct device *dev = &pdev->dev;
int count = dra7xx->phy_count;
+ int ret;
if (pp->irq_domain)
irq_domain_remove(pp->irq_domain);
@@ -467,6 +529,10 @@ static int __exit dra7xx_pcie_remove(struct platform_device *pdev)
phy_exit(dra7xx->phy[count]);
}
+ ret = dra7xx_pcie_assert_reset(pdev);
+ if (ret < 0)
+ return ret;
+
return 0;
}
--
1.7.9.5
[toc] | [prev] | [next] | [standalone]
| From | Kishon Vijay Abraham I <kishon@ti.com> |
|---|---|
| Date | 2016-01-14 15:20 +0100 |
| Subject | [PATCH v3 1/3] ARM: DRA7: hwmod: Add reset data for PCIe |
| Message-ID | <qQQUP-8fS-47@gated-at.bofh.it> |
| In reply to | #1309311 |
Add PCIe reset data to PCIe hwmods on DRA7x.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Sekhar Nori <nsekhar@ti.com>
Reviewed-by: Suman Anna <s-anna@ti.com>
---
arch/arm/mach-omap2/omap_hwmod_7xx_data.c | 15 +++++++++++++++
arch/arm/mach-omap2/prm7xx.h | 1 +
2 files changed, 16 insertions(+)
diff --git a/arch/arm/mach-omap2/omap_hwmod_7xx_data.c b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c
index ee4e044..1281deb 100644
--- a/arch/arm/mach-omap2/omap_hwmod_7xx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c
@@ -1532,14 +1532,21 @@ static struct omap_hwmod_class dra7xx_pciess_hwmod_class = {
};
/* pcie1 */
+static struct omap_hwmod_rst_info dra7xx_pciess1_resets[] = {
+ { .name = "pcie", .rst_shift = 0 },
+};
+
static struct omap_hwmod dra7xx_pciess1_hwmod = {
.name = "pcie1",
.class = &dra7xx_pciess_hwmod_class,
.clkdm_name = "pcie_clkdm",
+ .rst_lines = dra7xx_pciess1_resets,
+ .rst_lines_cnt = ARRAY_SIZE(dra7xx_pciess1_resets),
.main_clk = "l4_root_clk_div",
.prcm = {
.omap4 = {
.clkctrl_offs = DRA7XX_CM_L3INIT_PCIESS1_CLKCTRL_OFFSET,
+ .rstctrl_offs = DRA7XX_RM_L3INIT_PCIESS_RSTCTRL_OFFSET,
.context_offs = DRA7XX_RM_L3INIT_PCIESS1_CONTEXT_OFFSET,
.modulemode = MODULEMODE_SWCTRL,
},
@@ -1547,14 +1554,22 @@ static struct omap_hwmod dra7xx_pciess1_hwmod = {
};
/* pcie2 */
+static struct omap_hwmod_rst_info dra7xx_pciess2_resets[] = {
+ { .name = "pcie", .rst_shift = 1 },
+};
+
+/* pcie2 */
static struct omap_hwmod dra7xx_pciess2_hwmod = {
.name = "pcie2",
.class = &dra7xx_pciess_hwmod_class,
.clkdm_name = "pcie_clkdm",
+ .rst_lines = dra7xx_pciess2_resets,
+ .rst_lines_cnt = ARRAY_SIZE(dra7xx_pciess2_resets),
.main_clk = "l4_root_clk_div",
.prcm = {
.omap4 = {
.clkctrl_offs = DRA7XX_CM_L3INIT_PCIESS2_CLKCTRL_OFFSET,
+ .rstctrl_offs = DRA7XX_RM_L3INIT_PCIESS_RSTCTRL_OFFSET,
.context_offs = DRA7XX_RM_L3INIT_PCIESS2_CONTEXT_OFFSET,
.modulemode = MODULEMODE_SWCTRL,
},
diff --git a/arch/arm/mach-omap2/prm7xx.h b/arch/arm/mach-omap2/prm7xx.h
index cc1e6a2..294deed 100644
--- a/arch/arm/mach-omap2/prm7xx.h
+++ b/arch/arm/mach-omap2/prm7xx.h
@@ -360,6 +360,7 @@
/* PRM.L3INIT_PRM register offsets */
#define DRA7XX_PM_L3INIT_PWRSTCTRL_OFFSET 0x0000
#define DRA7XX_PM_L3INIT_PWRSTST_OFFSET 0x0004
+#define DRA7XX_RM_L3INIT_PCIESS_RSTCTRL_OFFSET 0x0010
#define DRA7XX_PM_L3INIT_MMC1_WKDEP_OFFSET 0x0028
#define DRA7XX_RM_L3INIT_MMC1_CONTEXT_OFFSET 0x002c
#define DRA7XX_PM_L3INIT_MMC2_WKDEP_OFFSET 0x0030
--
1.7.9.5
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web