aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/imx6/patches-3.14/208-ventana-plx-allow-override-gpio-output-mask.patch
blob: 7c2d1b0936e50b3e3e97dedfdae7acba039027da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
This patch allows passing in the gpio output mask used for GPIO0-7 on the
PLX PCIe bridge. These GPIO's are used for PERST# on the downstream ports.

Allowing the kernel to override the default configuration allows for keeping
specific devices held in reset. One important use of this is to allow
temporarily disabling devices that may request too many resources such as
an unprogrammed i210 device.

--- a/arch/arm/mach-imx/mach-imx6q.c
+++ b/arch/arm/mach-imx/mach-imx6q.c
@@ -84,6 +84,7 @@ static int ksz9031rn_phy_fixup(struct ph
  * fixup for PLX PEX8909 bridge to configure GPIO1-7 as output High
  * as they are used for slots1-7 PERST#
  */
+unsigned int ventana_plx_gpio = 0xfe;
 static void ventana_pciesw_early_fixup(struct pci_dev *dev)
 {
 	u32 dw;
@@ -95,19 +96,25 @@ static void ventana_pciesw_early_fixup(s
 		return;
 
 	pci_read_config_dword(dev, 0x62c, &dw);
+	dev_info(&dev->dev, "de-asserting downstream PERST# 0x%04x\n",
+		 ventana_plx_gpio);
 	dw |= 0xaaa8; // GPIO1-7 outputs
 	pci_write_config_dword(dev, 0x62c, dw);
-
-	pci_read_config_dword(dev, 0x644, &dw);
-	dw |= 0xfe;   // GPIO1-7 output high
-	pci_write_config_dword(dev, 0x644, dw);
-
+	pci_write_config_dword(dev, 0x644, ventana_plx_gpio);
 	msleep(100);
 }
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_PLX, 0x8609, ventana_pciesw_early_fixup);
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_PLX, 0x8606, ventana_pciesw_early_fixup);
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_PLX, 0x8604, ventana_pciesw_early_fixup);
 
+static int __init setup_ventana_plx_gpio(char *str)
+{
+	get_option(&str, &ventana_plx_gpio);
+
+	return 0;
+}
+early_param("plx_gpio", setup_ventana_plx_gpio);
+
 static int ar8031_phy_fixup(struct phy_device *dev)
 {
 	u16 val;
@@ -308,7 +315,7 @@ static void __init imx6q_init_irq(void)
 	irqchip_init();
 }
 
-static const char *imx6q_dt_compat[] __initconst = {
+static const char *imx6q_dt_compat[] __initdata = {
 	"fsl,imx6dl",
 	"fsl,imx6q",
 	NULL,