aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm63xx/patches-4.19/143-gpio-fix-device-tree-gpio-hogs-on-dual-role-gpio-pin.patch
blob: 395b17c8de66021ab6157ca6bf762085dff42a0b (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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
From 081f2aa16800b186e0cfde52f41afa805a3d53c2 Mon Sep 17 00:00:00 2001
From: Holger Freyther <zecke@openmoko.org>
Date: Fri, 25 Jul 2008 23:06:04 +0100
Subject: [PATCH] Fix the firing of "Jack"-Interrupts after resume when the modem is powered on.

GTA02_GPIO_nDL_GSM defaults to high/1. On resume do not enable the DL_GSM if
it was not enabled before. This is stopping the storm of interrupts.

Fix the logic in the download file handling. Downloads are disabled (0) when
the GTA02_GPIO_nDL_GSM is high (1). To enable downloading set
GTA02_GPIO_nDL_GSM to low (0, !on). Disable the jack interrupt while download
the is active. When disabling download we will get a couple of jack interrupts
but this is hardly avoidable.

Avoid reading the GPIO value if we do not even have a console set.

Signed-Off-by: Holger Freyther <zecke@openmoko.org>
---
 arch/arm/plat-s3c24xx/neo1973_pm_gsm.c |   35 +++++++++++++++++++++++--------
 1 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c b/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
index 1123d7d..b4ea8ba 100644
--- a/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
+++ b/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
@@ -17,8 +17,9 @@
 #include <linux/platform_device.h>
 #include <linux/console.h>
 #include <linux/errno.h>
+#include <linux/interrupt.h>
 
-#include <asm/hardware.h>
+#include <asm/gpio.h>
 #include <asm/mach-types.h>
 #include <asm/arch/gta01.h>
 
@@ -30,6 +31,7 @@
 
 struct gta01pm_priv {
 	int gpio_ngsm_en;
+        int gpio_ndl_gsm;
 	struct console *con;
 };
 
@@ -68,7 +70,7 @@ static ssize_t gsm_read(struct device *dev, struct device_attribute *attr,
 #endif
 #ifdef CONFIG_MACH_NEO1973_GTA02
 		if (machine_is_neo1973_gta02())
-			if (s3c2410_gpio_getpin(GTA02_GPIO_nDL_GSM))
+			if (!s3c2410_gpio_getpin(GTA02_GPIO_nDL_GSM))
 				goto out_1;
 #endif
 	}
@@ -143,8 +145,18 @@ static ssize_t gsm_write(struct device *dev, struct device_attribute *attr,
 			s3c2410_gpio_setpin(GTA01_GPIO_MODEM_DNLOAD, on);
 #endif
 #ifdef CONFIG_MACH_NEO1973_GTA02
-		if (machine_is_neo1973_gta02())
-			s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, on);
+		if (machine_is_neo1973_gta02()) {
+			/* FIXME: Layering violation, we know how this relates to
+			 * the Jack-IRQ. And we assume the keyboard driver to be
+			 * around. */
+			if (on)
+			    disable_irq(gpio_to_irq(GTA02_GPIO_JACK_INSERT));
+			else
+			    enable_irq(gpio_to_irq(GTA02_GPIO_JACK_INSERT));
+
+			gta01_gsm.gpio_ndl_gsm = !on;
+			s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, !on);
+		}
 #endif
 	}
 
@@ -159,26 +171,29 @@ static DEVICE_ATTR(download, 0644, gsm_read, gsm_write);
 static int gta01_gsm_suspend(struct platform_device *pdev, pm_message_t state)
 {
 	/* GPIO state is saved/restored by S3C2410 core GPIO driver, so we
-	 * don't need to do anything here */
+	 * don't need to do much here. */
+
 
-	/* disable DL GSM to prevent jack_insert becoming floating */
+	/* disable DL GSM to prevent jack_insert becoming 'floating' */
 	if (machine_is_neo1973_gta02())
 		s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 1);
+
 	return 0;
 }
 
 static int gta01_gsm_resume(struct platform_device *pdev)
 {
 	/* GPIO state is saved/restored by S3C2410 core GPIO driver, so we
-	 * don't need to do anything here */
+	 * don't need to do much here. */
 
 	/* Make sure that the kernel console on the serial port is still
 	 * disabled. FIXME: resume ordering race with serial driver! */
-	if (s3c2410_gpio_getpin(GTA01_GPIO_MODEM_ON) && gta01_gsm.con)
+	if (gta01_gsm.con && s3c2410_gpio_getpin(GTA01_GPIO_MODEM_ON))
 		console_stop(gta01_gsm.con);
 
 	if (machine_is_neo1973_gta02())
-		s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 0);
+		s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, gta01_gsm.gpio_ndl_gsm);
+
 	return 0;
 }
 #else
@@ -248,6 +263,8 @@ static int __init gta01_gsm_probe(struct platform_device *pdev)
 	} else
 		gta01_gsm.con = NULL;
 
+	gta01_gsm.gpio_ndl_gsm = 1;
+
 	return sysfs_create_group(&pdev->dev.kobj, &gta01_gsm_attr_group);
 }
 
-- 
1.5.6.3