c931b21161
SVN-Revision: 13619
452 lines
8.2 KiB
Diff
Executable file
452 lines
8.2 KiB
Diff
Executable file
From c6eeaaf1c19526e7ceb535663c3b8143c19b8cc7 Mon Sep 17 00:00:00 2001
|
|
From: Andy Green <andy@openmoko.com>
|
|
Date: Fri, 25 Jul 2008 23:06:00 +0100
|
|
Subject: [PATCH] debug-suspend-dump-gpio-states-add-GPA.patch
|
|
|
|
Add support for GPA[] GPIO bus since we have some NCs
|
|
but they seem to output-only IO cells so no matter
|
|
|
|
Signed-off-by: Andy Green <andy@openmoko.com>
|
|
---
|
|
arch/arm/plat-s3c24xx/gpio.c | 421 ++++++++++++++++++++++++++++++++++++++++++
|
|
1 files changed, 421 insertions(+), 0 deletions(-)
|
|
|
|
diff --git a/arch/arm/plat-s3c24xx/gpio.c b/arch/arm/plat-s3c24xx/gpio.c
|
|
index ee99dcc..4e94801 100644
|
|
--- a/arch/arm/plat-s3c24xx/gpio.c
|
|
+++ b/arch/arm/plat-s3c24xx/gpio.c
|
|
@@ -32,6 +32,7 @@
|
|
#include <asm/io.h>
|
|
|
|
#include <asm/arch/regs-gpio.h>
|
|
+#include <asm/arch/regs-gpioj.h>
|
|
|
|
void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)
|
|
{
|
|
@@ -215,3 +216,423 @@ int s3c2410_gpio_irq2pin(unsigned int irq)
|
|
}
|
|
|
|
EXPORT_SYMBOL(s3c2410_gpio_irq2pin);
|
|
+
|
|
+static void pretty_dump(u32 cfg, u32 state, u32 pull,
|
|
+ const char ** function_names_2,
|
|
+ const char ** function_names_3,
|
|
+ const char * prefix,
|
|
+ int count)
|
|
+{
|
|
+ int n;
|
|
+ const char *tag_type = NULL,
|
|
+ *tag_state = NULL,
|
|
+ *tag_pulldown = NULL,
|
|
+ * level0 = "0",
|
|
+ * level1 = "1";
|
|
+
|
|
+ for (n = 0; n < count; n++) {
|
|
+ switch ((cfg >> (2 * n)) & 3) {
|
|
+ case 0:
|
|
+ tag_type = "input ";
|
|
+ break;
|
|
+ case 1:
|
|
+ tag_type = "OUTPUT ";
|
|
+ break;
|
|
+ case 2:
|
|
+ if (function_names_2) {
|
|
+ if (function_names_2[n])
|
|
+ tag_type = function_names_2[n];
|
|
+ else
|
|
+ tag_type = "*** ILLEGAL CFG (2) *** ";
|
|
+ } else
|
|
+ tag_type = "(function) ";
|
|
+ break;
|
|
+ default:
|
|
+ if (function_names_3) {
|
|
+ if (function_names_3[n])
|
|
+ tag_type = function_names_3[n];
|
|
+ else
|
|
+ tag_type = "*** ILLEGAL CFG (3) *** ";
|
|
+ } else
|
|
+ tag_type = "(function) ";
|
|
+ break;
|
|
+ }
|
|
+ if ((state >> n) & 1)
|
|
+ tag_state = level1;
|
|
+ else
|
|
+ tag_state = level0;
|
|
+
|
|
+ if (((pull >> n) & 1))
|
|
+ tag_pulldown = "";
|
|
+ else
|
|
+ tag_pulldown = "(pulldown)";
|
|
+
|
|
+ printk(KERN_INFO"%s%02d: %s %s %s\n", prefix, n, tag_type,
|
|
+ tag_state, tag_pulldown);
|
|
+ }
|
|
+ printk(KERN_INFO"\n");
|
|
+}
|
|
+
|
|
+static void pretty_dump_a(u32 cfg, u32 state,
|
|
+ const char ** function_names,
|
|
+ const char * prefix,
|
|
+ int count)
|
|
+{
|
|
+ int n;
|
|
+ const char *tag_type = NULL,
|
|
+ *tag_state = NULL,
|
|
+ * level0 = "0",
|
|
+ * level1 = "1";
|
|
+
|
|
+ for (n = 0; n < count; n++) {
|
|
+ switch ((cfg >> n) & 1) {
|
|
+ case 0:
|
|
+ tag_type = "OUTPUT ";
|
|
+ break;
|
|
+ default:
|
|
+ if (function_names) {
|
|
+ if (function_names[n])
|
|
+ tag_type = function_names[n];
|
|
+ else
|
|
+ tag_type = "*** ILLEGAL CFG *** ";
|
|
+ } else
|
|
+ tag_type = "(function) ";
|
|
+ break;
|
|
+ }
|
|
+ if ((state >> n) & 1)
|
|
+ tag_state = level1;
|
|
+ else
|
|
+ tag_state = level0;
|
|
+
|
|
+ printk(KERN_INFO"%s%02d: %s %s\n", prefix, n, tag_type,
|
|
+ tag_state);
|
|
+ }
|
|
+ printk(KERN_INFO"\n");
|
|
+}
|
|
+
|
|
+static const char * funcs_a[] = {
|
|
+ "ADDR0 ",
|
|
+ "ADDR16 ",
|
|
+ "ADDR17 ",
|
|
+ "ADDR18 ",
|
|
+ "ADDR19 ",
|
|
+ "ADDR20 ",
|
|
+ "ADDR21 ",
|
|
+ "ADDR22 ",
|
|
+ "ADDR23 ",
|
|
+ "ADDR24 ",
|
|
+ "ADDR25 ",
|
|
+ "ADDR26 ",
|
|
+ "nGCS[1] ",
|
|
+ "nGCS[2] ",
|
|
+ "nGCS[3] ",
|
|
+ "nGCS[4] ",
|
|
+ "nGCS[5] ",
|
|
+ "CLE ",
|
|
+ "ALE ",
|
|
+ "nFWE ",
|
|
+ "nFRE ",
|
|
+ "nRSTOUT ",
|
|
+ "nFCE ",
|
|
+ NULL,
|
|
+ NULL
|
|
+};
|
|
+
|
|
+
|
|
+static const char * funcs_b2[] = {
|
|
+ "TOUT0 ",
|
|
+ "TOUT1 ",
|
|
+ "TOUT2 ",
|
|
+ "TOUT3 ",
|
|
+ "TCLK[0] ",
|
|
+ "nXBACK ",
|
|
+ "nXBREQ ",
|
|
+ "nXDACK1 ",
|
|
+ "nXDREQ1 ",
|
|
+ "nXDACK0 ",
|
|
+ "nXDREQ0 ",
|
|
+};
|
|
+static const char * funcs_b3[] = {
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+};
|
|
+
|
|
+static const char * funcs_c2[] = {
|
|
+ "LEND ",
|
|
+ "VCLK ",
|
|
+ "VLINE ",
|
|
+ "VFRAME ",
|
|
+ "VM ",
|
|
+ "LCD_LPCOE ",
|
|
+ "LCD_LPCREV ",
|
|
+ "LCD_LPCREVB",
|
|
+ "VD[0] ",
|
|
+ "VD[1] ",
|
|
+ "VD[2] ",
|
|
+ "VD[3] ",
|
|
+ "VD[4] ",
|
|
+ "VD[5] ",
|
|
+ "VD[6] ",
|
|
+ "VD[7] ",
|
|
+};
|
|
+static const char * funcs_c3[] = {
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ "I2SSDI ",
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+};
|
|
+
|
|
+static const char * funcs_d2[] = {
|
|
+ "VD[8] ",
|
|
+ "VD[9] ",
|
|
+ "VD[10] ",
|
|
+ "VD[11] ",
|
|
+ "VD[12] ",
|
|
+ "VD[13] ",
|
|
+ "VD[14] ",
|
|
+ "VD[15] ",
|
|
+ "VD[16] ",
|
|
+ "VD[17] ",
|
|
+ "VD[18] ",
|
|
+ "VD[19] ",
|
|
+ "VD[20] ",
|
|
+ "VD[21] ",
|
|
+ "VD[22] ",
|
|
+ "VD[23] ",
|
|
+};
|
|
+static const char * funcs_d3[] = {
|
|
+ "nSPICS1 ",
|
|
+ "SPICLK1 ",
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ "SPIMISO1 ",
|
|
+ "SPIMOSI1 ",
|
|
+ "SPICLK1 ",
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ "nSS1 ",
|
|
+ "nSS0 ",
|
|
+};
|
|
+
|
|
+static const char * funcs_e2[] = {
|
|
+ "I2SLRCK ",
|
|
+ "I2SSCLK ",
|
|
+ "CDCLK ",
|
|
+ "I2SDI ",
|
|
+ "I2SDO ",
|
|
+ "SDCLK ",
|
|
+ "SDCMD ",
|
|
+ "SDDAT0 ",
|
|
+ "SDDAT1 ",
|
|
+ "SDDAT2 ",
|
|
+ "SDDAT3 ",
|
|
+ "SPIMISO0 ",
|
|
+ "SPIMOSI0 ",
|
|
+ "SPICLK0 ",
|
|
+ "IICSCL ",
|
|
+ "IICSDA ",
|
|
+};
|
|
+static const char * funcs_e3[] = {
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+};
|
|
+
|
|
+static const char * funcs_f2[] = {
|
|
+ "EINT[0] ",
|
|
+ "EINT[1] ",
|
|
+ "EINT[2] ",
|
|
+ "EINT[3] ",
|
|
+ "EINT[4] ",
|
|
+ "EINT[5] ",
|
|
+ "EINT[6] ",
|
|
+ "EINT[7] ",
|
|
+};
|
|
+static const char * funcs_f3[] = {
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+};
|
|
+
|
|
+
|
|
+static const char * funcs_g2[] = {
|
|
+ "EINT[8] ",
|
|
+ "EINT[9] ",
|
|
+ "EINT[10] ",
|
|
+ "EINT[11] ",
|
|
+ "EINT[12] ",
|
|
+ "EINT[13] ",
|
|
+ "EINT[14] ",
|
|
+ "EINT[15] ",
|
|
+ "EINT[16] ",
|
|
+ "EINT[17] ",
|
|
+ "EINT[18] ",
|
|
+ "EINT[19] ",
|
|
+ "EINT[20] ",
|
|
+ "EINT[21] ",
|
|
+ "EINT[22] ",
|
|
+ "EINT[23] ",
|
|
+};
|
|
+static const char * funcs_g3[] = {
|
|
+ NULL,
|
|
+ NULL,
|
|
+ "nSS0 ",
|
|
+ "nSS1 ",
|
|
+ "LCD_PWRDN ",
|
|
+ "SPIMISO1 ",
|
|
+ "SPIMOSI1 ",
|
|
+ "SPICLK1 ",
|
|
+ NULL,
|
|
+ "nRTS1 ",
|
|
+ "nCTS1 ",
|
|
+ "TCLK[1] ",
|
|
+ "nSPICS0 ",
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+};
|
|
+
|
|
+static const char * funcs_h2[] = {
|
|
+ "nCTS0 ",
|
|
+ "nRTS0 ",
|
|
+ "TXD[0] ",
|
|
+ "RXD[0] ",
|
|
+ "TXD[1] ",
|
|
+ "RXD[1] ",
|
|
+ "TXD[2] ",
|
|
+ "RXD[2] ",
|
|
+ "UEXTCLK ",
|
|
+ "CLKOUT0 ",
|
|
+ "CLKOUT1 ",
|
|
+};
|
|
+static const char * funcs_h3[] = {
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ "nRTS1 ",
|
|
+ "nCTS1 ",
|
|
+ NULL,
|
|
+ "nSPICS0 ",
|
|
+ NULL,
|
|
+};
|
|
+
|
|
+static const char * funcs_j2[] = {
|
|
+ "CAMDATA[0] ",
|
|
+ "CAMDATA[1] ",
|
|
+ "CAMDATA[2] ",
|
|
+ "CAMDATA[3] ",
|
|
+ "CAMDATA[4] ",
|
|
+ "CAMDATA[5] ",
|
|
+ "CAMDATA[6] ",
|
|
+ "CAMDATA[7] ",
|
|
+ "CAMPCLK ",
|
|
+ "CAMVSYNC ",
|
|
+ "CAMHREF ",
|
|
+ "CAMCLKOUT ",
|
|
+ "CAMRESET ",
|
|
+};
|
|
+static const char * funcs_j3[] = {
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ NULL,
|
|
+};
|
|
+
|
|
+/* used to dump GPIO states at suspend */
|
|
+void s3c24xx_dump_gpio_states(void)
|
|
+{
|
|
+ pretty_dump_a(__raw_readl(S3C2410_GPACON),
|
|
+ __raw_readl(S3C2410_GPADAT),
|
|
+ funcs_a, "GPA", 25);
|
|
+ pretty_dump(__raw_readl(S3C2410_GPBCON),
|
|
+ __raw_readl(S3C2410_GPBDAT),
|
|
+ __raw_readl(S3C2410_GPBUP),
|
|
+ funcs_b2, funcs_b3, "GPB", 11);
|
|
+ pretty_dump(__raw_readl(S3C2410_GPCCON),
|
|
+ __raw_readl(S3C2410_GPCDAT),
|
|
+ __raw_readl(S3C2410_GPCUP),
|
|
+ funcs_c2, funcs_c3, "GPC", 16);
|
|
+ pretty_dump(__raw_readl(S3C2410_GPDCON),
|
|
+ __raw_readl(S3C2410_GPDDAT),
|
|
+ __raw_readl(S3C2410_GPDUP),
|
|
+ funcs_d2, funcs_d3, "GPD", 16);
|
|
+ pretty_dump(__raw_readl(S3C2410_GPECON),
|
|
+ __raw_readl(S3C2410_GPEDAT),
|
|
+ __raw_readl(S3C2410_GPEUP),
|
|
+ funcs_e2, funcs_e3, "GPE", 16);
|
|
+ pretty_dump(__raw_readl(S3C2410_GPFCON),
|
|
+ __raw_readl(S3C2410_GPFDAT),
|
|
+ __raw_readl(S3C2410_GPFUP),
|
|
+ funcs_f2, funcs_f3, "GPF", 8);
|
|
+ pretty_dump(__raw_readl(S3C2410_GPGCON),
|
|
+ __raw_readl(S3C2410_GPGDAT),
|
|
+ __raw_readl(S3C2410_GPGUP),
|
|
+ funcs_g2, funcs_g3, "GPG", 16);
|
|
+ pretty_dump(__raw_readl(S3C2410_GPHCON),
|
|
+ __raw_readl(S3C2410_GPHDAT),
|
|
+ __raw_readl(S3C2410_GPHUP),
|
|
+ funcs_h2, funcs_h3, "GPH", 11);
|
|
+ pretty_dump(__raw_readl(S3C2440_GPJCON),
|
|
+ __raw_readl(S3C2440_GPJDAT),
|
|
+ __raw_readl(S3C2440_GPJUP),
|
|
+ funcs_j2, funcs_j3, "GPJ", 13);
|
|
+
|
|
+}
|
|
+EXPORT_SYMBOL(s3c24xx_dump_gpio_states);
|
|
+
|
|
--
|
|
1.5.6.3
|
|
|