2010-08-31 02:36:08

by Mark F. Brown

[permalink] [raw]
Subject: [PATCH 0/5] ARM: pxa168: add keypad support

In order to add keypad support for pxa168

1) Make pxa27x_keypad.h accessible to mach-mmp
2) Add a special interrupt handler for pxa168 keypad interrupts
This interrupt handler fixes an issue on the SoC that prevents the
keypad driver from being able to clear the keypad interrupt.
3) Add initial board level support

Mark F. Brown (5):
ARM: pxa27x/pxa3xx: moved pxa27x_keypad.h to platform pxa directory
ARM: pxa168: added keypad support
ARM: pxa168: added wake clear register support for APMU
ARM: pxa168: added special case handler for keypad interrupts
ARM: pxa168: aspenite: add board support for keypad

arch/arm/mach-mmp/aspenite.c | 27 +++++++++++
arch/arm/mach-mmp/include/mach/mfp-pxa168.h | 7 +++
arch/arm/mach-mmp/include/mach/pxa168.h | 7 +++
arch/arm/mach-mmp/include/mach/regs-apmu.h | 12 +++++
arch/arm/mach-mmp/irq-pxa168.c | 23 +++++++++-
arch/arm/mach-mmp/pxa168.c | 3 +
arch/arm/mach-pxa/devices.c | 2 +-
arch/arm/mach-pxa/em-x270.c | 2 +-
arch/arm/mach-pxa/ezx.c | 2 +-
arch/arm/mach-pxa/include/mach/pxa27x_keypad.h | 59 ------------------------
arch/arm/mach-pxa/littleton.c | 2 +-
arch/arm/mach-pxa/mainstone.c | 4 +-
arch/arm/mach-pxa/mioa701.c | 2 +-
arch/arm/mach-pxa/palmld.c | 2 +-
arch/arm/mach-pxa/palmt5.c | 2 +-
arch/arm/mach-pxa/palmtreo.c | 2 +-
arch/arm/mach-pxa/palmtx.c | 2 +-
arch/arm/mach-pxa/palmz72.c | 2 +-
arch/arm/mach-pxa/tavorevb.c | 2 +-
arch/arm/mach-pxa/z2.c | 2 +-
arch/arm/mach-pxa/zylonite.c | 2 +-
arch/arm/plat-pxa/include/plat/pxa27x_keypad.h | 59 ++++++++++++++++++++++++
drivers/input/keyboard/Kconfig | 2 +-
drivers/input/keyboard/pxa27x_keypad.c | 2 +-
24 files changed, 154 insertions(+), 77 deletions(-)
delete mode 100644 arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
create mode 100644 arch/arm/plat-pxa/include/plat/pxa27x_keypad.h


2010-08-31 02:36:20

by Mark F. Brown

[permalink] [raw]
Subject: [PATCH 2/5] ARM: pxa168: added keypad support

Signed-off-by: Mark F. Brown <[email protected]>
---
arch/arm/mach-mmp/include/mach/mfp-pxa168.h | 7 +++++++
arch/arm/mach-mmp/include/mach/pxa168.h | 7 +++++++
arch/arm/mach-mmp/pxa168.c | 3 +++
drivers/input/keyboard/Kconfig | 2 +-
4 files changed, 18 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-mmp/include/mach/mfp-pxa168.h b/arch/arm/mach-mmp/include/mach/mfp-pxa168.h
index ded43c4..4621067 100644
--- a/arch/arm/mach-mmp/include/mach/mfp-pxa168.h
+++ b/arch/arm/mach-mmp/include/mach/mfp-pxa168.h
@@ -289,4 +289,11 @@
#define GPIO86_PWM1_OUT MFP_CFG(GPIO86, AF2)
#define GPIO86_PWM2_OUT MFP_CFG(GPIO86, AF3)

+/* Keypad */
+#define GPIO109_KP_MKIN1 MFP_CFG(GPIO109, AF7)
+#define GPIO110_KP_MKIN0 MFP_CFG(GPIO110, AF7)
+#define GPIO111_KP_MKOUT7 MFP_CFG(GPIO111, AF7)
+#define GPIO112_KP_MKOUT6 MFP_CFG(GPIO112, AF7)
+#define GPIO121_KP_MKIN4 MFP_CFG(GPIO121, AF7)
+
#endif /* __ASM_MACH_MFP_PXA168_H */
diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h b/arch/arm/mach-mmp/include/mach/pxa168.h
index 220738f..f34e663 100644
--- a/arch/arm/mach-mmp/include/mach/pxa168.h
+++ b/arch/arm/mach-mmp/include/mach/pxa168.h
@@ -11,6 +11,7 @@ extern void __init pxa168_init_irq(void);
#include <plat/i2c.h>
#include <plat/pxa3xx_nand.h>
#include <video/pxa168fb.h>
+#include <plat/pxa27x_keypad.h>

extern struct pxa_device_desc pxa168_device_uart1;
extern struct pxa_device_desc pxa168_device_uart2;
@@ -27,6 +28,7 @@ extern struct pxa_device_desc pxa168_device_ssp4;
extern struct pxa_device_desc pxa168_device_ssp5;
extern struct pxa_device_desc pxa168_device_nand;
extern struct pxa_device_desc pxa168_device_fb;
+extern struct pxa_device_desc pxa168_device_keypad;

static inline int pxa168_add_uart(int id)
{
@@ -105,4 +107,9 @@ static inline int pxa168_add_fb(struct pxa168fb_mach_info *mi)
return pxa_register_device(&pxa168_device_fb, mi, sizeof(*mi));
}

+static inline int pxa168_add_keypad(struct pxa27x_keypad_platform_data *data)
+{
+ return pxa_register_device(&pxa168_device_keypad, data, sizeof(*data));
+}
+
#endif /* __ASM_MACH_PXA168_H */
diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c
index eaebf66..2fa16fb 100644
--- a/arch/arm/mach-mmp/pxa168.c
+++ b/arch/arm/mach-mmp/pxa168.c
@@ -77,6 +77,7 @@ static APBC_CLK(ssp2, PXA168_SSP2, 4, 0);
static APBC_CLK(ssp3, PXA168_SSP3, 4, 0);
static APBC_CLK(ssp4, PXA168_SSP4, 4, 0);
static APBC_CLK(ssp5, PXA168_SSP5, 4, 0);
+static APBC_CLK(keypad, PXA168_KPC, 0, 32000);

static APMU_CLK(nand, NAND, 0x01db, 208000000);
static APMU_CLK(lcd, LCD, 0x7f, 312000000);
@@ -98,6 +99,7 @@ static struct clk_lookup pxa168_clkregs[] = {
INIT_CLKREG(&clk_ssp5, "pxa168-ssp.4", NULL),
INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL),
INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL),
+ INIT_CLKREG(&clk_keypad, "pxa27x-keypad", NULL),
};

static int __init pxa168_init(void)
@@ -150,3 +152,4 @@ PXA168_DEVICE(ssp3, "pxa168-ssp", 2, SSP3, 0xd401f000, 0x40, 56, 57);
PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, 0xd4020000, 0x40, 58, 59);
PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, 0xd4021000, 0x40, 60, 61);
PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, 0xd420b000, 0x1c8);
+PXA168_DEVICE(keypad, "pxa27x-keypad", -1, KEYPAD, 0xd4012000, 0x4c);
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
index 9cc488d..aa037fe 100644
--- a/drivers/input/keyboard/Kconfig
+++ b/drivers/input/keyboard/Kconfig
@@ -338,7 +338,7 @@ config KEYBOARD_OPENCORES

config KEYBOARD_PXA27x
tristate "PXA27x/PXA3xx keypad support"
- depends on PXA27x || PXA3xx
+ depends on PXA27x || PXA3xx || ARCH_MMP
help
Enable support for PXA27x/PXA3xx keypad controller.

--
1.7.0.4

2010-08-31 02:36:15

by Mark F. Brown

[permalink] [raw]
Subject: [PATCH 1/5] ARM: pxa27x/pxa3xx: moved pxa27x_keypad.h to platform pxa directory

mach-mmp utilizes pxa27x_keypad code so we need to move header to
platform pxa directory.

Signed-off-by: Mark F. Brown <[email protected]>
---
arch/arm/mach-pxa/devices.c | 2 +-
arch/arm/mach-pxa/em-x270.c | 2 +-
arch/arm/mach-pxa/ezx.c | 2 +-
arch/arm/mach-pxa/include/mach/pxa27x_keypad.h | 59 ------------------------
arch/arm/mach-pxa/littleton.c | 2 +-
arch/arm/mach-pxa/mainstone.c | 4 +-
arch/arm/mach-pxa/mioa701.c | 2 +-
arch/arm/mach-pxa/palmld.c | 2 +-
arch/arm/mach-pxa/palmt5.c | 2 +-
arch/arm/mach-pxa/palmtreo.c | 2 +-
arch/arm/mach-pxa/palmtx.c | 2 +-
arch/arm/mach-pxa/palmz72.c | 2 +-
arch/arm/mach-pxa/tavorevb.c | 2 +-
arch/arm/mach-pxa/z2.c | 2 +-
arch/arm/mach-pxa/zylonite.c | 2 +-
arch/arm/plat-pxa/include/plat/pxa27x_keypad.h | 59 ++++++++++++++++++++++++
drivers/input/keyboard/pxa27x_keypad.c | 2 +-
17 files changed, 75 insertions(+), 75 deletions(-)
delete mode 100644 arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
create mode 100644 arch/arm/plat-pxa/include/plat/pxa27x_keypad.h

diff --git a/arch/arm/mach-pxa/devices.c b/arch/arm/mach-pxa/devices.c
index a2fc859..08b4103 100644
--- a/arch/arm/mach-pxa/devices.c
+++ b/arch/arm/mach-pxa/devices.c
@@ -11,7 +11,7 @@
#include <mach/mmc.h>
#include <mach/irda.h>
#include <mach/ohci.h>
-#include <mach/pxa27x_keypad.h>
+#include <plat/pxa27x_keypad.h>
#include <mach/pxa2xx_spi.h>
#include <mach/camera.h>
#include <mach/audio.h>
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c
index 0517c17..51286a7 100644
--- a/arch/arm/mach-pxa/em-x270.c
+++ b/arch/arm/mach-pxa/em-x270.c
@@ -43,7 +43,7 @@
#include <mach/pxafb.h>
#include <mach/ohci.h>
#include <mach/mmc.h>
-#include <mach/pxa27x_keypad.h>
+#include <plat/pxa27x_keypad.h>
#include <plat/i2c.h>
#include <mach/camera.h>
#include <mach/pxa2xx_spi.h>
diff --git a/arch/arm/mach-pxa/ezx.c b/arch/arm/mach-pxa/ezx.c
index 3fe61f4..f997e84 100644
--- a/arch/arm/mach-pxa/ezx.c
+++ b/arch/arm/mach-pxa/ezx.c
@@ -32,7 +32,7 @@
#include <mach/ohci.h>
#include <plat/i2c.h>
#include <mach/hardware.h>
-#include <mach/pxa27x_keypad.h>
+#include <plat/pxa27x_keypad.h>
#include <mach/camera.h>

#include "devices.h"
diff --git a/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h b/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
deleted file mode 100644
index 7b4eadc..0000000
--- a/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef __ASM_ARCH_PXA27x_KEYPAD_H
-#define __ASM_ARCH_PXA27x_KEYPAD_H
-
-#include <linux/input.h>
-#include <linux/input/matrix_keypad.h>
-
-#define MAX_MATRIX_KEY_ROWS (8)
-#define MAX_MATRIX_KEY_COLS (8)
-#define MATRIX_ROW_SHIFT (3)
-#define MAX_DIRECT_KEY_NUM (8)
-
-/* pxa3xx keypad platform specific parameters
- *
- * NOTE:
- * 1. direct_key_num indicates the number of keys in the direct keypad
- * _plus_ the number of rotary-encoder sensor inputs, this can be
- * left as 0 if only rotary encoders are enabled, the driver will
- * automatically calculate this
- *
- * 2. direct_key_map is the key code map for the direct keys, if rotary
- * encoder(s) are enabled, direct key 0/1(2/3) will be ignored
- *
- * 3. rotary can be either interpreted as a relative input event (e.g.
- * REL_WHEEL/REL_HWHEEL) or specific keys (e.g. UP/DOWN/LEFT/RIGHT)
- *
- * 4. matrix key and direct key will use the same debounce_interval by
- * default, which should be sufficient in most cases
- */
-struct pxa27x_keypad_platform_data {
-
- /* code map for the matrix keys */
- unsigned int matrix_key_rows;
- unsigned int matrix_key_cols;
- unsigned int *matrix_key_map;
- int matrix_key_map_size;
-
- /* direct keys */
- int direct_key_num;
- unsigned int direct_key_map[MAX_DIRECT_KEY_NUM];
-
- /* rotary encoders 0 */
- int enable_rotary0;
- int rotary0_rel_code;
- int rotary0_up_key;
- int rotary0_down_key;
-
- /* rotary encoders 1 */
- int enable_rotary1;
- int rotary1_rel_code;
- int rotary1_up_key;
- int rotary1_down_key;
-
- /* key debounce interval */
- unsigned int debounce_interval;
-};
-
-extern void pxa_set_keypad_info(struct pxa27x_keypad_platform_data *info);
-
-#endif /* __ASM_ARCH_PXA27x_KEYPAD_H */
diff --git a/arch/arm/mach-pxa/littleton.c b/arch/arm/mach-pxa/littleton.c
index 83f3236..eb58506 100644
--- a/arch/arm/mach-pxa/littleton.c
+++ b/arch/arm/mach-pxa/littleton.c
@@ -43,7 +43,7 @@
#include <mach/pxafb.h>
#include <mach/mmc.h>
#include <mach/pxa2xx_spi.h>
-#include <mach/pxa27x_keypad.h>
+#include <plat/pxa27x_keypad.h>
#include <mach/littleton.h>
#include <plat/i2c.h>
#include <plat/pxa3xx_nand.h>
diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c
index c2a8717..126dca1 100644
--- a/arch/arm/mach-pxa/mainstone.c
+++ b/arch/arm/mach-pxa/mainstone.c
@@ -41,7 +41,7 @@
#include <asm/mach/irq.h>
#include <asm/mach/flash.h>

-#include <mach/pxa27x.h>
+#include <plat/pxa27x.h>
#include <mach/gpio.h>
#include <mach/mainstone.h>
#include <mach/audio.h>
@@ -50,7 +50,7 @@
#include <mach/mmc.h>
#include <mach/irda.h>
#include <mach/ohci.h>
-#include <mach/pxa27x_keypad.h>
+#include <plat/pxa27x_keypad.h>

#include "generic.h"
#include "devices.h"
diff --git a/arch/arm/mach-pxa/mioa701.c b/arch/arm/mach-pxa/mioa701.c
index dc66942..ffb3f5a 100644
--- a/arch/arm/mach-pxa/mioa701.c
+++ b/arch/arm/mach-pxa/mioa701.c
@@ -45,7 +45,7 @@

#include <mach/pxa27x.h>
#include <mach/regs-rtc.h>
-#include <mach/pxa27x_keypad.h>
+#include <plat/pxa27x_keypad.h>
#include <mach/pxafb.h>
#include <mach/mmc.h>
#include <mach/udc.h>
diff --git a/arch/arm/mach-pxa/palmld.c b/arch/arm/mach-pxa/palmld.c
index 91038ee..3ff0c4a 100644
--- a/arch/arm/mach-pxa/palmld.c
+++ b/arch/arm/mach-pxa/palmld.c
@@ -39,7 +39,7 @@
#include <mach/mmc.h>
#include <mach/pxafb.h>
#include <mach/irda.h>
-#include <mach/pxa27x_keypad.h>
+#include <plat/pxa27x_keypad.h>
#include <mach/palmasoc.h>
#include <mach/palm27x.h>

diff --git a/arch/arm/mach-pxa/palmt5.c b/arch/arm/mach-pxa/palmt5.c
index 1c28199..5b9f766 100644
--- a/arch/arm/mach-pxa/palmt5.c
+++ b/arch/arm/mach-pxa/palmt5.c
@@ -39,7 +39,7 @@
#include <mach/mmc.h>
#include <mach/pxafb.h>
#include <mach/irda.h>
-#include <mach/pxa27x_keypad.h>
+#include <plat/pxa27x_keypad.h>
#include <mach/udc.h>
#include <mach/palmasoc.h>
#include <mach/palm27x.h>
diff --git a/arch/arm/mach-pxa/palmtreo.c b/arch/arm/mach-pxa/palmtreo.c
index 52defd5..f685a60 100644
--- a/arch/arm/mach-pxa/palmtreo.c
+++ b/arch/arm/mach-pxa/palmtreo.c
@@ -39,7 +39,7 @@
#include <mach/mmc.h>
#include <mach/pxafb.h>
#include <mach/irda.h>
-#include <mach/pxa27x_keypad.h>
+#include <plat/pxa27x_keypad.h>
#include <mach/udc.h>
#include <mach/ohci.h>
#include <mach/pxa2xx-regs.h>
diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c
index 144dc2b..89a3792 100644
--- a/arch/arm/mach-pxa/palmtx.c
+++ b/arch/arm/mach-pxa/palmtx.c
@@ -43,7 +43,7 @@
#include <mach/mmc.h>
#include <mach/pxafb.h>
#include <mach/irda.h>
-#include <mach/pxa27x_keypad.h>
+#include <plat/pxa27x_keypad.h>
#include <mach/udc.h>
#include <mach/palmasoc.h>
#include <mach/palm27x.h>
diff --git a/arch/arm/mach-pxa/palmz72.c b/arch/arm/mach-pxa/palmz72.c
index 87e4b10..38f4425 100644
--- a/arch/arm/mach-pxa/palmz72.c
+++ b/arch/arm/mach-pxa/palmz72.c
@@ -41,7 +41,7 @@
#include <mach/mmc.h>
#include <mach/pxafb.h>
#include <mach/irda.h>
-#include <mach/pxa27x_keypad.h>
+#include <plat/pxa27x_keypad.h>
#include <mach/udc.h>
#include <mach/palmasoc.h>
#include <mach/palm27x.h>
diff --git a/arch/arm/mach-pxa/tavorevb.c b/arch/arm/mach-pxa/tavorevb.c
index f02dcb5..0f440c9 100644
--- a/arch/arm/mach-pxa/tavorevb.c
+++ b/arch/arm/mach-pxa/tavorevb.c
@@ -25,7 +25,7 @@

#include <mach/pxa930.h>
#include <mach/pxafb.h>
-#include <mach/pxa27x_keypad.h>
+#include <plat/pxa27x_keypad.h>

#include "devices.h"
#include "generic.h"
diff --git a/arch/arm/mach-pxa/z2.c b/arch/arm/mach-pxa/z2.c
index f0d0228..8c44bc4 100644
--- a/arch/arm/mach-pxa/z2.c
+++ b/arch/arm/mach-pxa/z2.c
@@ -37,7 +37,7 @@
#include <mach/z2.h>
#include <mach/pxafb.h>
#include <mach/mmc.h>
-#include <mach/pxa27x_keypad.h>
+#include <plat/pxa27x_keypad.h>
#include <mach/pxa2xx_spi.h>

#include <plat/i2c.h>
diff --git a/arch/arm/mach-pxa/zylonite.c b/arch/arm/mach-pxa/zylonite.c
index 2edad61..69df3ed 100644
--- a/arch/arm/mach-pxa/zylonite.c
+++ b/arch/arm/mach-pxa/zylonite.c
@@ -30,7 +30,7 @@
#include <mach/zylonite.h>
#include <mach/mmc.h>
#include <mach/ohci.h>
-#include <mach/pxa27x_keypad.h>
+#include <plat/pxa27x_keypad.h>
#include <plat/pxa3xx_nand.h>

#include "devices.h"
diff --git a/arch/arm/plat-pxa/include/plat/pxa27x_keypad.h b/arch/arm/plat-pxa/include/plat/pxa27x_keypad.h
new file mode 100644
index 0000000..7b4eadc
--- /dev/null
+++ b/arch/arm/plat-pxa/include/plat/pxa27x_keypad.h
@@ -0,0 +1,59 @@
+#ifndef __ASM_ARCH_PXA27x_KEYPAD_H
+#define __ASM_ARCH_PXA27x_KEYPAD_H
+
+#include <linux/input.h>
+#include <linux/input/matrix_keypad.h>
+
+#define MAX_MATRIX_KEY_ROWS (8)
+#define MAX_MATRIX_KEY_COLS (8)
+#define MATRIX_ROW_SHIFT (3)
+#define MAX_DIRECT_KEY_NUM (8)
+
+/* pxa3xx keypad platform specific parameters
+ *
+ * NOTE:
+ * 1. direct_key_num indicates the number of keys in the direct keypad
+ * _plus_ the number of rotary-encoder sensor inputs, this can be
+ * left as 0 if only rotary encoders are enabled, the driver will
+ * automatically calculate this
+ *
+ * 2. direct_key_map is the key code map for the direct keys, if rotary
+ * encoder(s) are enabled, direct key 0/1(2/3) will be ignored
+ *
+ * 3. rotary can be either interpreted as a relative input event (e.g.
+ * REL_WHEEL/REL_HWHEEL) or specific keys (e.g. UP/DOWN/LEFT/RIGHT)
+ *
+ * 4. matrix key and direct key will use the same debounce_interval by
+ * default, which should be sufficient in most cases
+ */
+struct pxa27x_keypad_platform_data {
+
+ /* code map for the matrix keys */
+ unsigned int matrix_key_rows;
+ unsigned int matrix_key_cols;
+ unsigned int *matrix_key_map;
+ int matrix_key_map_size;
+
+ /* direct keys */
+ int direct_key_num;
+ unsigned int direct_key_map[MAX_DIRECT_KEY_NUM];
+
+ /* rotary encoders 0 */
+ int enable_rotary0;
+ int rotary0_rel_code;
+ int rotary0_up_key;
+ int rotary0_down_key;
+
+ /* rotary encoders 1 */
+ int enable_rotary1;
+ int rotary1_rel_code;
+ int rotary1_up_key;
+ int rotary1_down_key;
+
+ /* key debounce interval */
+ unsigned int debounce_interval;
+};
+
+extern void pxa_set_keypad_info(struct pxa27x_keypad_platform_data *info);
+
+#endif /* __ASM_ARCH_PXA27x_KEYPAD_H */
diff --git a/drivers/input/keyboard/pxa27x_keypad.c b/drivers/input/keyboard/pxa27x_keypad.c
index 0e53b3b..0610d10 100644
--- a/drivers/input/keyboard/pxa27x_keypad.c
+++ b/drivers/input/keyboard/pxa27x_keypad.c
@@ -32,7 +32,7 @@
#include <asm/mach/map.h>

#include <mach/hardware.h>
-#include <mach/pxa27x_keypad.h>
+#include <plat/pxa27x_keypad.h>
/*
* Keypad Controller registers
*/
--
1.7.0.4

2010-08-31 02:36:22

by Mark F. Brown

[permalink] [raw]
Subject: [PATCH 3/5] ARM: pxa168: added wake clear register support for APMU

Signed-off-by: Mark F. Brown <[email protected]>
---
arch/arm/mach-mmp/include/mach/regs-apmu.h | 12 ++++++++++++
1 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-mmp/include/mach/regs-apmu.h b/arch/arm/mach-mmp/include/mach/regs-apmu.h
index 9190305..ac47023 100644
--- a/arch/arm/mach-mmp/include/mach/regs-apmu.h
+++ b/arch/arm/mach-mmp/include/mach/regs-apmu.h
@@ -33,4 +33,16 @@
#define APMU_FNRST_DIS (1 << 1)
#define APMU_AXIRST_DIS (1 << 0)

+/* Wake Clear Register */
+#define APMU_WAKE_CLR APMU_REG(0x07c)
+
+#define APMU_PXA168_KP_WAKE_CLR (1 << 7)
+#define APMU_PXA168_CFI_WAKE_CLR (1 << 6)
+#define APMU_PXA168_XD_WAKE_CLR (1 << 5)
+#define APMU_PXA168_MSP_WAKE_CLR (1 << 4)
+#define APMU_PXA168_SD4_WAKE_CLR (1 << 3)
+#define APMU_PXA168_SD3_WAKE_CLR (1 << 2)
+#define APMU_PXA168_SD2_WAKE_CLR (1 << 1)
+#define APMU_PXA168_SD1_WAKE_CLR (1 << 0)
+
#endif /* __ASM_MACH_REGS_APMU_H */
--
1.7.0.4

2010-08-31 02:36:26

by Mark F. Brown

[permalink] [raw]
Subject: [PATCH 5/5] ARM: pxa168: aspenite: add board support for keypad

Signed-off-by: Mark F. Brown <[email protected]>
---
arch/arm/mach-mmp/aspenite.c | 27 +++++++++++++++++++++++++++
1 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c
index 9e1bd6b..1b788c5 100644
--- a/arch/arm/mach-mmp/aspenite.c
+++ b/arch/arm/mach-mmp/aspenite.c
@@ -24,6 +24,8 @@
#include <mach/pxa168.h>
#include <mach/gpio.h>
#include <video/pxa168fb.h>
+#include <linux/input.h>
+#include <plat/pxa27x_keypad.h>

#include "common.h"

@@ -97,6 +99,13 @@ static unsigned long common_pin_config[] __initdata = {
GPIO81_LCD_DD21,
GPIO82_LCD_DD22,
GPIO83_LCD_DD23,
+
+ /* Keypad */
+ GPIO109_KP_MKIN1,
+ GPIO110_KP_MKIN0,
+ GPIO111_KP_MKOUT7,
+ GPIO112_KP_MKOUT6,
+ GPIO121_KP_MKIN4,
};

static struct smc91x_platdata smc91x_info = {
@@ -193,6 +202,23 @@ struct pxa168fb_mach_info aspenite_lcd_info = {
.invert_pixclock = 0,
};

+static unsigned int aspenite_matrix_key_map[] = {
+ KEY(0, 6, KEY_UP), /* SW 4 */
+ KEY(0, 7, KEY_DOWN), /* SW 5 */
+ KEY(1, 6, KEY_LEFT), /* SW 6 */
+ KEY(1, 7, KEY_RIGHT), /* SW 7 */
+ KEY(4, 6, KEY_ENTER), /* SW 8 */
+ KEY(4, 7, KEY_ESC), /* SW 9 */
+};
+
+static struct pxa27x_keypad_platform_data aspenite_keypad_info __initdata = {
+ .matrix_key_rows = 8,
+ .matrix_key_cols = 8,
+ .matrix_key_map = aspenite_matrix_key_map,
+ .matrix_key_map_size = ARRAY_SIZE(aspenite_matrix_key_map),
+ .debounce_interval = 30,
+};
+
static void __init common_init(void)
{
mfp_config(ARRAY_AND_SIZE(common_pin_config));
@@ -203,6 +229,7 @@ static void __init common_init(void)
pxa168_add_ssp(1);
pxa168_add_nand(&aspenite_nand_info);
pxa168_add_fb(&aspenite_lcd_info);
+ pxa168_add_keypad(&aspenite_keypad_info);

/* off-chip devices */
platform_device_register(&smc91x_device);
--
1.7.0.4

2010-08-31 02:36:24

by Mark F. Brown

[permalink] [raw]
Subject: [PATCH 4/5] ARM: pxa168: added special case handler for keypad interrupts

Signed-off-by: Mark F. Brown <[email protected]>
---
arch/arm/mach-mmp/irq-pxa168.c | 23 ++++++++++++++++++++++-
1 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-mmp/irq-pxa168.c b/arch/arm/mach-mmp/irq-pxa168.c
index 52ff2f0..bfb0984 100644
--- a/arch/arm/mach-mmp/irq-pxa168.c
+++ b/arch/arm/mach-mmp/irq-pxa168.c
@@ -17,6 +17,8 @@
#include <linux/io.h>

#include <mach/regs-icu.h>
+#include <mach/regs-apmu.h>
+#include <mach/cputype.h>

#include "common.h"

@@ -42,6 +44,19 @@ static struct irq_chip icu_irq_chip = {
.unmask = icu_unmask_irq,
};

+void handle_pxa168_keypad_irq(unsigned int irq, struct irq_desc *desc)
+{
+ uint32_t val;
+ uint32_t mask = APMU_PXA168_KP_WAKE_CLR;
+
+ /* clear keypad wake event */
+ val = __raw_readl(APMU_WAKE_CLR);
+ __raw_writel(val | mask, APMU_WAKE_CLR);
+
+ /* handle irq */
+ handle_level_irq(irq, desc);
+}
+
void __init icu_init_irq(void)
{
int irq;
@@ -49,7 +64,13 @@ void __init icu_init_irq(void)
for (irq = 0; irq < 64; irq++) {
icu_mask_irq(irq);
set_irq_chip(irq, &icu_irq_chip);
- set_irq_handler(irq, handle_level_irq);
+
+ /* special handler for keypad */
+ if (cpu_is_pxa168() && irq == IRQ_PXA168_KEYPAD)
+ set_irq_handler(irq, handle_pxa168_keypad_irq);
+ else
+ set_irq_handler(irq, handle_level_irq);
+
set_irq_flags(irq, IRQF_VALID);
}
}
--
1.7.0.4

2010-08-31 04:14:12

by Eric Miao

[permalink] [raw]
Subject: Re: [PATCH 1/5] ARM: pxa27x/pxa3xx: moved pxa27x_keypad.h to platform pxa directory

On Thu, Aug 26, 2010 at 5:18 PM, Mark F. Brown <[email protected]> wrote:
> mach-mmp utilizes pxa27x_keypad code so we need to move header to
> platform pxa directory.

Good move. I'm actually very inclined to move this into include/linux/input/.

And you may try '-M' when generating patches with 'git format-patch', and
see the difference of the output.

>
> Signed-off-by: Mark F. Brown <[email protected]>
> ---
>  arch/arm/mach-pxa/devices.c                    |    2 +-
>  arch/arm/mach-pxa/em-x270.c                    |    2 +-
>  arch/arm/mach-pxa/ezx.c                        |    2 +-
>  arch/arm/mach-pxa/include/mach/pxa27x_keypad.h |   59 ------------------------
>  arch/arm/mach-pxa/littleton.c                  |    2 +-
>  arch/arm/mach-pxa/mainstone.c                  |    4 +-
>  arch/arm/mach-pxa/mioa701.c                    |    2 +-
>  arch/arm/mach-pxa/palmld.c                     |    2 +-
>  arch/arm/mach-pxa/palmt5.c                     |    2 +-
>  arch/arm/mach-pxa/palmtreo.c                   |    2 +-
>  arch/arm/mach-pxa/palmtx.c                     |    2 +-
>  arch/arm/mach-pxa/palmz72.c                    |    2 +-
>  arch/arm/mach-pxa/tavorevb.c                   |    2 +-
>  arch/arm/mach-pxa/z2.c                         |    2 +-
>  arch/arm/mach-pxa/zylonite.c                   |    2 +-
>  arch/arm/plat-pxa/include/plat/pxa27x_keypad.h |   59 ++++++++++++++++++++++++
>  drivers/input/keyboard/pxa27x_keypad.c         |    2 +-
>  17 files changed, 75 insertions(+), 75 deletions(-)
>  delete mode 100644 arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
>  create mode 100644 arch/arm/plat-pxa/include/plat/pxa27x_keypad.h
>
> diff --git a/arch/arm/mach-pxa/devices.c b/arch/arm/mach-pxa/devices.c
> index a2fc859..08b4103 100644
> --- a/arch/arm/mach-pxa/devices.c
> +++ b/arch/arm/mach-pxa/devices.c
> @@ -11,7 +11,7 @@
>  #include <mach/mmc.h>
>  #include <mach/irda.h>
>  #include <mach/ohci.h>
> -#include <mach/pxa27x_keypad.h>
> +#include <plat/pxa27x_keypad.h>
>  #include <mach/pxa2xx_spi.h>
>  #include <mach/camera.h>
>  #include <mach/audio.h>
> diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c
> index 0517c17..51286a7 100644
> --- a/arch/arm/mach-pxa/em-x270.c
> +++ b/arch/arm/mach-pxa/em-x270.c
> @@ -43,7 +43,7 @@
>  #include <mach/pxafb.h>
>  #include <mach/ohci.h>
>  #include <mach/mmc.h>
> -#include <mach/pxa27x_keypad.h>
> +#include <plat/pxa27x_keypad.h>
>  #include <plat/i2c.h>
>  #include <mach/camera.h>
>  #include <mach/pxa2xx_spi.h>
> diff --git a/arch/arm/mach-pxa/ezx.c b/arch/arm/mach-pxa/ezx.c
> index 3fe61f4..f997e84 100644
> --- a/arch/arm/mach-pxa/ezx.c
> +++ b/arch/arm/mach-pxa/ezx.c
> @@ -32,7 +32,7 @@
>  #include <mach/ohci.h>
>  #include <plat/i2c.h>
>  #include <mach/hardware.h>
> -#include <mach/pxa27x_keypad.h>
> +#include <plat/pxa27x_keypad.h>
>  #include <mach/camera.h>
>
>  #include "devices.h"
> diff --git a/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h b/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
> deleted file mode 100644
> index 7b4eadc..0000000
> --- a/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
> +++ /dev/null
> @@ -1,59 +0,0 @@
> -#ifndef __ASM_ARCH_PXA27x_KEYPAD_H
> -#define __ASM_ARCH_PXA27x_KEYPAD_H
> -
> -#include <linux/input.h>
> -#include <linux/input/matrix_keypad.h>
> -
> -#define MAX_MATRIX_KEY_ROWS    (8)
> -#define MAX_MATRIX_KEY_COLS    (8)
> -#define MATRIX_ROW_SHIFT       (3)
> -#define MAX_DIRECT_KEY_NUM     (8)
> -
> -/* pxa3xx keypad platform specific parameters
> - *
> - * NOTE:
> - * 1. direct_key_num indicates the number of keys in the direct keypad
> - *    _plus_ the number of rotary-encoder sensor inputs,  this can be
> - *    left as 0 if only rotary encoders are enabled,  the driver will
> - *    automatically calculate this
> - *
> - * 2. direct_key_map is the key code map for the direct keys, if rotary
> - *    encoder(s) are enabled, direct key 0/1(2/3) will be ignored
> - *
> - * 3. rotary can be either interpreted as a relative input event (e.g.
> - *    REL_WHEEL/REL_HWHEEL) or specific keys (e.g. UP/DOWN/LEFT/RIGHT)
> - *
> - * 4. matrix key and direct key will use the same debounce_interval by
> - *    default, which should be sufficient in most cases
> - */
> -struct pxa27x_keypad_platform_data {
> -
> -       /* code map for the matrix keys */
> -       unsigned int    matrix_key_rows;
> -       unsigned int    matrix_key_cols;
> -       unsigned int    *matrix_key_map;
> -       int             matrix_key_map_size;
> -
> -       /* direct keys */
> -       int             direct_key_num;
> -       unsigned int    direct_key_map[MAX_DIRECT_KEY_NUM];
> -
> -       /* rotary encoders 0 */
> -       int             enable_rotary0;
> -       int             rotary0_rel_code;
> -       int             rotary0_up_key;
> -       int             rotary0_down_key;
> -
> -       /* rotary encoders 1 */
> -       int             enable_rotary1;
> -       int             rotary1_rel_code;
> -       int             rotary1_up_key;
> -       int             rotary1_down_key;
> -
> -       /* key debounce interval */
> -       unsigned int    debounce_interval;
> -};
> -
> -extern void pxa_set_keypad_info(struct pxa27x_keypad_platform_data *info);
> -
> -#endif /* __ASM_ARCH_PXA27x_KEYPAD_H */
> diff --git a/arch/arm/mach-pxa/littleton.c b/arch/arm/mach-pxa/littleton.c
> index 83f3236..eb58506 100644
> --- a/arch/arm/mach-pxa/littleton.c
> +++ b/arch/arm/mach-pxa/littleton.c
> @@ -43,7 +43,7 @@
>  #include <mach/pxafb.h>
>  #include <mach/mmc.h>
>  #include <mach/pxa2xx_spi.h>
> -#include <mach/pxa27x_keypad.h>
> +#include <plat/pxa27x_keypad.h>
>  #include <mach/littleton.h>
>  #include <plat/i2c.h>
>  #include <plat/pxa3xx_nand.h>
> diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c
> index c2a8717..126dca1 100644
> --- a/arch/arm/mach-pxa/mainstone.c
> +++ b/arch/arm/mach-pxa/mainstone.c
> @@ -41,7 +41,7 @@
>  #include <asm/mach/irq.h>
>  #include <asm/mach/flash.h>
>
> -#include <mach/pxa27x.h>
> +#include <plat/pxa27x.h>
>  #include <mach/gpio.h>
>  #include <mach/mainstone.h>
>  #include <mach/audio.h>
> @@ -50,7 +50,7 @@
>  #include <mach/mmc.h>
>  #include <mach/irda.h>
>  #include <mach/ohci.h>
> -#include <mach/pxa27x_keypad.h>
> +#include <plat/pxa27x_keypad.h>
>
>  #include "generic.h"
>  #include "devices.h"
> diff --git a/arch/arm/mach-pxa/mioa701.c b/arch/arm/mach-pxa/mioa701.c
> index dc66942..ffb3f5a 100644
> --- a/arch/arm/mach-pxa/mioa701.c
> +++ b/arch/arm/mach-pxa/mioa701.c
> @@ -45,7 +45,7 @@
>
>  #include <mach/pxa27x.h>
>  #include <mach/regs-rtc.h>
> -#include <mach/pxa27x_keypad.h>
> +#include <plat/pxa27x_keypad.h>
>  #include <mach/pxafb.h>
>  #include <mach/mmc.h>
>  #include <mach/udc.h>
> diff --git a/arch/arm/mach-pxa/palmld.c b/arch/arm/mach-pxa/palmld.c
> index 91038ee..3ff0c4a 100644
> --- a/arch/arm/mach-pxa/palmld.c
> +++ b/arch/arm/mach-pxa/palmld.c
> @@ -39,7 +39,7 @@
>  #include <mach/mmc.h>
>  #include <mach/pxafb.h>
>  #include <mach/irda.h>
> -#include <mach/pxa27x_keypad.h>
> +#include <plat/pxa27x_keypad.h>
>  #include <mach/palmasoc.h>
>  #include <mach/palm27x.h>
>
> diff --git a/arch/arm/mach-pxa/palmt5.c b/arch/arm/mach-pxa/palmt5.c
> index 1c28199..5b9f766 100644
> --- a/arch/arm/mach-pxa/palmt5.c
> +++ b/arch/arm/mach-pxa/palmt5.c
> @@ -39,7 +39,7 @@
>  #include <mach/mmc.h>
>  #include <mach/pxafb.h>
>  #include <mach/irda.h>
> -#include <mach/pxa27x_keypad.h>
> +#include <plat/pxa27x_keypad.h>
>  #include <mach/udc.h>
>  #include <mach/palmasoc.h>
>  #include <mach/palm27x.h>
> diff --git a/arch/arm/mach-pxa/palmtreo.c b/arch/arm/mach-pxa/palmtreo.c
> index 52defd5..f685a60 100644
> --- a/arch/arm/mach-pxa/palmtreo.c
> +++ b/arch/arm/mach-pxa/palmtreo.c
> @@ -39,7 +39,7 @@
>  #include <mach/mmc.h>
>  #include <mach/pxafb.h>
>  #include <mach/irda.h>
> -#include <mach/pxa27x_keypad.h>
> +#include <plat/pxa27x_keypad.h>
>  #include <mach/udc.h>
>  #include <mach/ohci.h>
>  #include <mach/pxa2xx-regs.h>
> diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c
> index 144dc2b..89a3792 100644
> --- a/arch/arm/mach-pxa/palmtx.c
> +++ b/arch/arm/mach-pxa/palmtx.c
> @@ -43,7 +43,7 @@
>  #include <mach/mmc.h>
>  #include <mach/pxafb.h>
>  #include <mach/irda.h>
> -#include <mach/pxa27x_keypad.h>
> +#include <plat/pxa27x_keypad.h>
>  #include <mach/udc.h>
>  #include <mach/palmasoc.h>
>  #include <mach/palm27x.h>
> diff --git a/arch/arm/mach-pxa/palmz72.c b/arch/arm/mach-pxa/palmz72.c
> index 87e4b10..38f4425 100644
> --- a/arch/arm/mach-pxa/palmz72.c
> +++ b/arch/arm/mach-pxa/palmz72.c
> @@ -41,7 +41,7 @@
>  #include <mach/mmc.h>
>  #include <mach/pxafb.h>
>  #include <mach/irda.h>
> -#include <mach/pxa27x_keypad.h>
> +#include <plat/pxa27x_keypad.h>
>  #include <mach/udc.h>
>  #include <mach/palmasoc.h>
>  #include <mach/palm27x.h>
> diff --git a/arch/arm/mach-pxa/tavorevb.c b/arch/arm/mach-pxa/tavorevb.c
> index f02dcb5..0f440c9 100644
> --- a/arch/arm/mach-pxa/tavorevb.c
> +++ b/arch/arm/mach-pxa/tavorevb.c
> @@ -25,7 +25,7 @@
>
>  #include <mach/pxa930.h>
>  #include <mach/pxafb.h>
> -#include <mach/pxa27x_keypad.h>
> +#include <plat/pxa27x_keypad.h>
>
>  #include "devices.h"
>  #include "generic.h"
> diff --git a/arch/arm/mach-pxa/z2.c b/arch/arm/mach-pxa/z2.c
> index f0d0228..8c44bc4 100644
> --- a/arch/arm/mach-pxa/z2.c
> +++ b/arch/arm/mach-pxa/z2.c
> @@ -37,7 +37,7 @@
>  #include <mach/z2.h>
>  #include <mach/pxafb.h>
>  #include <mach/mmc.h>
> -#include <mach/pxa27x_keypad.h>
> +#include <plat/pxa27x_keypad.h>
>  #include <mach/pxa2xx_spi.h>
>
>  #include <plat/i2c.h>
> diff --git a/arch/arm/mach-pxa/zylonite.c b/arch/arm/mach-pxa/zylonite.c
> index 2edad61..69df3ed 100644
> --- a/arch/arm/mach-pxa/zylonite.c
> +++ b/arch/arm/mach-pxa/zylonite.c
> @@ -30,7 +30,7 @@
>  #include <mach/zylonite.h>
>  #include <mach/mmc.h>
>  #include <mach/ohci.h>
> -#include <mach/pxa27x_keypad.h>
> +#include <plat/pxa27x_keypad.h>
>  #include <plat/pxa3xx_nand.h>
>
>  #include "devices.h"
> diff --git a/arch/arm/plat-pxa/include/plat/pxa27x_keypad.h b/arch/arm/plat-pxa/include/plat/pxa27x_keypad.h
> new file mode 100644
> index 0000000..7b4eadc
> --- /dev/null
> +++ b/arch/arm/plat-pxa/include/plat/pxa27x_keypad.h
> @@ -0,0 +1,59 @@
> +#ifndef __ASM_ARCH_PXA27x_KEYPAD_H
> +#define __ASM_ARCH_PXA27x_KEYPAD_H
> +
> +#include <linux/input.h>
> +#include <linux/input/matrix_keypad.h>
> +
> +#define MAX_MATRIX_KEY_ROWS    (8)
> +#define MAX_MATRIX_KEY_COLS    (8)
> +#define MATRIX_ROW_SHIFT       (3)
> +#define MAX_DIRECT_KEY_NUM     (8)
> +
> +/* pxa3xx keypad platform specific parameters
> + *
> + * NOTE:
> + * 1. direct_key_num indicates the number of keys in the direct keypad
> + *    _plus_ the number of rotary-encoder sensor inputs,  this can be
> + *    left as 0 if only rotary encoders are enabled,  the driver will
> + *    automatically calculate this
> + *
> + * 2. direct_key_map is the key code map for the direct keys, if rotary
> + *    encoder(s) are enabled, direct key 0/1(2/3) will be ignored
> + *
> + * 3. rotary can be either interpreted as a relative input event (e.g.
> + *    REL_WHEEL/REL_HWHEEL) or specific keys (e.g. UP/DOWN/LEFT/RIGHT)
> + *
> + * 4. matrix key and direct key will use the same debounce_interval by
> + *    default, which should be sufficient in most cases
> + */
> +struct pxa27x_keypad_platform_data {
> +
> +       /* code map for the matrix keys */
> +       unsigned int    matrix_key_rows;
> +       unsigned int    matrix_key_cols;
> +       unsigned int    *matrix_key_map;
> +       int             matrix_key_map_size;
> +
> +       /* direct keys */
> +       int             direct_key_num;
> +       unsigned int    direct_key_map[MAX_DIRECT_KEY_NUM];
> +
> +       /* rotary encoders 0 */
> +       int             enable_rotary0;
> +       int             rotary0_rel_code;
> +       int             rotary0_up_key;
> +       int             rotary0_down_key;
> +
> +       /* rotary encoders 1 */
> +       int             enable_rotary1;
> +       int             rotary1_rel_code;
> +       int             rotary1_up_key;
> +       int             rotary1_down_key;
> +
> +       /* key debounce interval */
> +       unsigned int    debounce_interval;
> +};
> +
> +extern void pxa_set_keypad_info(struct pxa27x_keypad_platform_data *info);
> +
> +#endif /* __ASM_ARCH_PXA27x_KEYPAD_H */
> diff --git a/drivers/input/keyboard/pxa27x_keypad.c b/drivers/input/keyboard/pxa27x_keypad.c
> index 0e53b3b..0610d10 100644
> --- a/drivers/input/keyboard/pxa27x_keypad.c
> +++ b/drivers/input/keyboard/pxa27x_keypad.c
> @@ -32,7 +32,7 @@
>  #include <asm/mach/map.h>
>
>  #include <mach/hardware.h>
> -#include <mach/pxa27x_keypad.h>
> +#include <plat/pxa27x_keypad.h>
>  /*
>  * Keypad Controller registers
>  */
> --
> 1.7.0.4
>
>

2010-08-31 04:53:19

by Haojian Zhuang

[permalink] [raw]
Subject: Re: [PATCH 4/5] ARM: pxa168: added special case handler for keypad interrupts

On Thu, Aug 26, 2010 at 5:18 PM, Mark F. Brown <[email protected]> wrote:
> Signed-off-by: Mark F. Brown <[email protected]>
> ---
> ?arch/arm/mach-mmp/irq-pxa168.c | ? 23 ++++++++++++++++++++++-
> ?1 files changed, 22 insertions(+), 1 deletions(-)
>
> diff --git a/arch/arm/mach-mmp/irq-pxa168.c b/arch/arm/mach-mmp/irq-pxa168.c
> index 52ff2f0..bfb0984 100644
> --- a/arch/arm/mach-mmp/irq-pxa168.c
> +++ b/arch/arm/mach-mmp/irq-pxa168.c
> @@ -17,6 +17,8 @@
> ?#include <linux/io.h>
>
> ?#include <mach/regs-icu.h>
> +#include <mach/regs-apmu.h>
> +#include <mach/cputype.h>
>
> ?#include "common.h"
>
> @@ -42,6 +44,19 @@ static struct irq_chip icu_irq_chip = {
> ? ? ? ?.unmask = icu_unmask_irq,
> ?};
>
> +void handle_pxa168_keypad_irq(unsigned int irq, struct irq_desc *desc)
> +{
> + ? ? ? uint32_t val;
> + ? ? ? uint32_t mask = APMU_PXA168_KP_WAKE_CLR;
> +
> + ? ? ? /* clear keypad wake event */
> + ? ? ? val = __raw_readl(APMU_WAKE_CLR);
> + ? ? ? __raw_writel(val | ?mask, APMU_WAKE_CLR);
> +
> + ? ? ? /* handle irq */
> + ? ? ? handle_level_irq(irq, desc);
> +}
> +

Why should you clear wakeup event status in IRQ handler? If system is
resumed by keypad event, you should clear this wakeup source in resume
code. I think that IRQ code should not be binded with wakeup event at
here.

> ?void __init icu_init_irq(void)
> ?{
> ? ? ? ?int irq;
> @@ -49,7 +64,13 @@ void __init icu_init_irq(void)
> ? ? ? ?for (irq = 0; irq < 64; irq++) {
> ? ? ? ? ? ? ? ?icu_mask_irq(irq);
> ? ? ? ? ? ? ? ?set_irq_chip(irq, &icu_irq_chip);
> - ? ? ? ? ? ? ? set_irq_handler(irq, handle_level_irq);
> +
> + ? ? ? ? ? ? ? /* special handler for keypad */
> + ? ? ? ? ? ? ? if (cpu_is_pxa168() && irq == IRQ_PXA168_KEYPAD)
> + ? ? ? ? ? ? ? ? ? ? ? set_irq_handler(irq, handle_pxa168_keypad_irq);
> + ? ? ? ? ? ? ? else
> + ? ? ? ? ? ? ? ? ? ? ? set_irq_handler(irq, handle_level_irq);
> +
> ? ? ? ? ? ? ? ?set_irq_flags(irq, IRQF_VALID);
> ? ? ? ?}
> ?}
> --
> 1.7.0.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at ?http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at ?http://www.tux.org/lkml/
>

2010-08-31 04:56:05

by Haojian Zhuang

[permalink] [raw]
Subject: Re: [PATCH 2/5] ARM: pxa168: added keypad support

On Thu, Aug 26, 2010 at 5:18 PM, Mark F. Brown <[email protected]> wrote:
> Signed-off-by: Mark F. Brown <[email protected]>
> ---
> ?arch/arm/mach-mmp/include/mach/mfp-pxa168.h | ? ?7 +++++++
> ?arch/arm/mach-mmp/include/mach/pxa168.h ? ? | ? ?7 +++++++
> ?arch/arm/mach-mmp/pxa168.c ? ? ? ? ? ? ? ? ?| ? ?3 +++
> ?drivers/input/keyboard/Kconfig ? ? ? ? ? ? ?| ? ?2 +-
> ?4 files changed, 18 insertions(+), 1 deletions(-)
>
> diff --git a/arch/arm/mach-mmp/include/mach/mfp-pxa168.h b/arch/arm/mach-mmp/include/mach/mfp-pxa168.h
> index ded43c4..4621067 100644
> --- a/arch/arm/mach-mmp/include/mach/mfp-pxa168.h
> +++ b/arch/arm/mach-mmp/include/mach/mfp-pxa168.h
> @@ -289,4 +289,11 @@
> ?#define GPIO86_PWM1_OUT ? ? ? ? ? ? ? ?MFP_CFG(GPIO86, AF2)
> ?#define GPIO86_PWM2_OUT ? ? ? ? ? ? ? ?MFP_CFG(GPIO86, AF3)
>
> +/* Keypad */
> +#define GPIO109_KP_MKIN1 ? ? ? ?MFP_CFG(GPIO109, AF7)
> +#define GPIO110_KP_MKIN0 ? ? ? ?MFP_CFG(GPIO110, AF7)
> +#define GPIO111_KP_MKOUT7 ? ? ? MFP_CFG(GPIO111, AF7)
> +#define GPIO112_KP_MKOUT6 ? ? ? MFP_CFG(GPIO112, AF7)
> +#define GPIO121_KP_MKIN4 ? ? ? ?MFP_CFG(GPIO121, AF7)
> +
> ?#endif /* __ASM_MACH_MFP_PXA168_H */
> diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h b/arch/arm/mach-mmp/include/mach/pxa168.h
> index 220738f..f34e663 100644
> --- a/arch/arm/mach-mmp/include/mach/pxa168.h
> +++ b/arch/arm/mach-mmp/include/mach/pxa168.h
> @@ -11,6 +11,7 @@ extern void __init pxa168_init_irq(void);
> ?#include <plat/i2c.h>
> ?#include <plat/pxa3xx_nand.h>
> ?#include <video/pxa168fb.h>
> +#include <plat/pxa27x_keypad.h>
>
> ?extern struct pxa_device_desc pxa168_device_uart1;
> ?extern struct pxa_device_desc pxa168_device_uart2;
> @@ -27,6 +28,7 @@ extern struct pxa_device_desc pxa168_device_ssp4;
> ?extern struct pxa_device_desc pxa168_device_ssp5;
> ?extern struct pxa_device_desc pxa168_device_nand;
> ?extern struct pxa_device_desc pxa168_device_fb;
> +extern struct pxa_device_desc pxa168_device_keypad;
>
> ?static inline int pxa168_add_uart(int id)
> ?{
> @@ -105,4 +107,9 @@ static inline int pxa168_add_fb(struct pxa168fb_mach_info *mi)
> ? ? ? ?return pxa_register_device(&pxa168_device_fb, mi, sizeof(*mi));
> ?}
>
> +static inline int pxa168_add_keypad(struct pxa27x_keypad_platform_data *data)
> +{
> + ? ? ? return pxa_register_device(&pxa168_device_keypad, data, sizeof(*data));
> +}
> +
> ?#endif /* __ASM_MACH_PXA168_H */
> diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c
> index eaebf66..2fa16fb 100644
> --- a/arch/arm/mach-mmp/pxa168.c
> +++ b/arch/arm/mach-mmp/pxa168.c
> @@ -77,6 +77,7 @@ static APBC_CLK(ssp2, PXA168_SSP2, 4, 0);
> ?static APBC_CLK(ssp3, PXA168_SSP3, 4, 0);
> ?static APBC_CLK(ssp4, PXA168_SSP4, 4, 0);
> ?static APBC_CLK(ssp5, PXA168_SSP5, 4, 0);
> +static APBC_CLK(keypad, PXA168_KPC, 0, 32000);
>
> ?static APMU_CLK(nand, NAND, 0x01db, 208000000);
> ?static APMU_CLK(lcd, LCD, 0x7f, 312000000);
> @@ -98,6 +99,7 @@ static struct clk_lookup pxa168_clkregs[] = {
> ? ? ? ?INIT_CLKREG(&clk_ssp5, "pxa168-ssp.4", NULL),
> ? ? ? ?INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL),
> ? ? ? ?INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL),
> + ? ? ? INIT_CLKREG(&clk_keypad, "pxa27x-keypad", NULL),
> ?};
>
> ?static int __init pxa168_init(void)
> @@ -150,3 +152,4 @@ PXA168_DEVICE(ssp3, "pxa168-ssp", 2, SSP3, 0xd401f000, 0x40, 56, 57);
> ?PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, 0xd4020000, 0x40, 58, 59);
> ?PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, 0xd4021000, 0x40, 60, 61);
> ?PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, 0xd420b000, 0x1c8);
> +PXA168_DEVICE(keypad, "pxa27x-keypad", -1, KEYPAD, 0xd4012000, 0x4c);
> diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
> index 9cc488d..aa037fe 100644
> --- a/drivers/input/keyboard/Kconfig
> +++ b/drivers/input/keyboard/Kconfig
> @@ -338,7 +338,7 @@ config KEYBOARD_OPENCORES
>
> ?config KEYBOARD_PXA27x
> ? ? ? ?tristate "PXA27x/PXA3xx keypad support"
> - ? ? ? depends on PXA27x || PXA3xx
> + ? ? ? depends on PXA27x || PXA3xx || ARCH_MMP
> ? ? ? ?help
> ? ? ? ? ?Enable support for PXA27x/PXA3xx keypad controller.
>
> --
> 1.7.0.4
>
It seems good. Acked

2010-08-31 05:00:37

by Haojian Zhuang

[permalink] [raw]
Subject: Re: [PATCH 5/5] ARM: pxa168: aspenite: add board support for keypad

On Thu, Aug 26, 2010 at 5:18 PM, Mark F. Brown <[email protected]> wrote:
> Signed-off-by: Mark F. Brown <[email protected]>
> ---
> ?arch/arm/mach-mmp/aspenite.c | ? 27 +++++++++++++++++++++++++++
> ?1 files changed, 27 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c
> index 9e1bd6b..1b788c5 100644
> --- a/arch/arm/mach-mmp/aspenite.c
> +++ b/arch/arm/mach-mmp/aspenite.c
> @@ -24,6 +24,8 @@
> ?#include <mach/pxa168.h>
> ?#include <mach/gpio.h>
> ?#include <video/pxa168fb.h>
> +#include <linux/input.h>
> +#include <plat/pxa27x_keypad.h>
>
> ?#include "common.h"
>
> @@ -97,6 +99,13 @@ static unsigned long common_pin_config[] __initdata = {
> ? ? ? ?GPIO81_LCD_DD21,
> ? ? ? ?GPIO82_LCD_DD22,
> ? ? ? ?GPIO83_LCD_DD23,
> +
> + ? ? ? /* Keypad */
> + ? ? ? GPIO109_KP_MKIN1,
> + ? ? ? GPIO110_KP_MKIN0,
> + ? ? ? GPIO111_KP_MKOUT7,
> + ? ? ? GPIO112_KP_MKOUT6,
> + ? ? ? GPIO121_KP_MKIN4,
> ?};
>
> ?static struct smc91x_platdata smc91x_info = {
> @@ -193,6 +202,23 @@ struct pxa168fb_mach_info aspenite_lcd_info = {
> ? ? ? ?.invert_pixclock ? ? ? ?= 0,
> ?};
>
> +static unsigned int aspenite_matrix_key_map[] = {
> + ? ? ? KEY(0, 6, KEY_UP), ? ? ?/* SW 4 */
> + ? ? ? KEY(0, 7, KEY_DOWN), ? ?/* SW 5 */
> + ? ? ? KEY(1, 6, KEY_LEFT), ? ?/* SW 6 */
> + ? ? ? KEY(1, 7, KEY_RIGHT), ? /* SW 7 */
> + ? ? ? KEY(4, 6, KEY_ENTER), ? /* SW 8 */
> + ? ? ? KEY(4, 7, KEY_ESC), ? ? /* SW 9 */
> +};
> +
> +static struct pxa27x_keypad_platform_data aspenite_keypad_info __initdata = {
> + ? ? ? .matrix_key_rows ? ? ? ?= 8,
> + ? ? ? .matrix_key_cols ? ? ? ?= 8,
It seems that maxium columns is 5, not 8.

> + ? ? ? .matrix_key_map ? ? ? ? = aspenite_matrix_key_map,
> + ? ? ? .matrix_key_map_size ? ?= ARRAY_SIZE(aspenite_matrix_key_map),
> + ? ? ? .debounce_interval ? ? ?= 30,
> +};
> +
> ?static void __init common_init(void)
> ?{
> ? ? ? ?mfp_config(ARRAY_AND_SIZE(common_pin_config));
> @@ -203,6 +229,7 @@ static void __init common_init(void)
> ? ? ? ?pxa168_add_ssp(1);
> ? ? ? ?pxa168_add_nand(&aspenite_nand_info);
> ? ? ? ?pxa168_add_fb(&aspenite_lcd_info);
> + ? ? ? pxa168_add_keypad(&aspenite_keypad_info);
>
> ? ? ? ?/* off-chip devices */
> ? ? ? ?platform_device_register(&smc91x_device);
> --
> 1.7.0.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at ?http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at ?http://www.tux.org/lkml/
>

2010-08-31 06:29:03

by Mark F. Brown

[permalink] [raw]
Subject: Re: [PATCH 4/5] ARM: pxa168: added special case handler for keypad interrupts

On Tue, Aug 31, 2010 at 12:53 AM, Haojian Zhuang
<[email protected]> wrote:
> On Thu, Aug 26, 2010 at 5:18 PM, Mark F. Brown <[email protected]> wrote:
>> Signed-off-by: Mark F. Brown <[email protected]>
>> ---
>> ?arch/arm/mach-mmp/irq-pxa168.c | ? 23 ++++++++++++++++++++++-
>> ?1 files changed, 22 insertions(+), 1 deletions(-)
>>
>> diff --git a/arch/arm/mach-mmp/irq-pxa168.c b/arch/arm/mach-mmp/irq-pxa168.c
>> index 52ff2f0..bfb0984 100644
>> --- a/arch/arm/mach-mmp/irq-pxa168.c
>> +++ b/arch/arm/mach-mmp/irq-pxa168.c
>> @@ -17,6 +17,8 @@
>> ?#include <linux/io.h>
>>
>> ?#include <mach/regs-icu.h>
>> +#include <mach/regs-apmu.h>
>> +#include <mach/cputype.h>
>>
>> ?#include "common.h"
>>
>> @@ -42,6 +44,19 @@ static struct irq_chip icu_irq_chip = {
>> ? ? ? ?.unmask = icu_unmask_irq,
>> ?};
>>
>> +void handle_pxa168_keypad_irq(unsigned int irq, struct irq_desc *desc)
>> +{
>> + ? ? ? uint32_t val;
>> + ? ? ? uint32_t mask = APMU_PXA168_KP_WAKE_CLR;
>> +
>> + ? ? ? /* clear keypad wake event */
>> + ? ? ? val = __raw_readl(APMU_WAKE_CLR);
>> + ? ? ? __raw_writel(val | ?mask, APMU_WAKE_CLR);
>> +
>> + ? ? ? /* handle irq */
>> + ? ? ? handle_level_irq(irq, desc);
>> +}
>> +
>
> Why should you clear wakeup event status in IRQ handler? If system is
> resumed by keypad event, you should clear this wakeup source in resume
> code. I think that IRQ code should not be binded with wakeup event at
> here.
>
>> ?void __init icu_init_irq(void)
>> ?{
>> ? ? ? ?int irq;
>> @@ -49,7 +64,13 @@ void __init icu_init_irq(void)
>> ? ? ? ?for (irq = 0; irq < 64; irq++) {
>> ? ? ? ? ? ? ? ?icu_mask_irq(irq);
>> ? ? ? ? ? ? ? ?set_irq_chip(irq, &icu_irq_chip);
>> - ? ? ? ? ? ? ? set_irq_handler(irq, handle_level_irq);
>> +
>> + ? ? ? ? ? ? ? /* special handler for keypad */
>> + ? ? ? ? ? ? ? if (cpu_is_pxa168() && irq == IRQ_PXA168_KEYPAD)
>> + ? ? ? ? ? ? ? ? ? ? ? set_irq_handler(irq, handle_pxa168_keypad_irq);
>> + ? ? ? ? ? ? ? else
>> + ? ? ? ? ? ? ? ? ? ? ? set_irq_handler(irq, handle_level_irq);
>> +
>> ? ? ? ? ? ? ? ?set_irq_flags(irq, IRQF_VALID);
>> ? ? ? ?}
>> ?}
>> --
>> 1.7.0.4
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>> the body of a message to [email protected]
>> More majordomo info at ?http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at ?http://www.tux.org/lkml/
>>
>

Haojian, this is an usual case, but without that clear wake event you
will not be able to clear the keypad interrupt. For my push to open
source I re-wrote the workaround code and added it as a special case
IRQ handler. In the Marvell pxa168 code base it is actually located in
the keypad interrupt handler as the function clear_wakeup(). I felt it
was better to isolate this code in the mmp common code base instead.

Regards,
-- Mark

2010-08-31 07:06:16

by Eric Miao

[permalink] [raw]
Subject: Re: [PATCH 4/5] ARM: pxa168: added special case handler for keypad interrupts

On Tue, Aug 31, 2010 at 2:28 PM, Mark F. Brown <[email protected]> wrote:
> On Tue, Aug 31, 2010 at 12:53 AM, Haojian Zhuang
> <[email protected]> wrote:
>> On Thu, Aug 26, 2010 at 5:18 PM, Mark F. Brown <[email protected]> wrote:
>>> Signed-off-by: Mark F. Brown <[email protected]>
>>> ---
>>>  arch/arm/mach-mmp/irq-pxa168.c |   23 ++++++++++++++++++++++-
>>>  1 files changed, 22 insertions(+), 1 deletions(-)
>>>
>>> diff --git a/arch/arm/mach-mmp/irq-pxa168.c b/arch/arm/mach-mmp/irq-pxa168.c
>>> index 52ff2f0..bfb0984 100644
>>> --- a/arch/arm/mach-mmp/irq-pxa168.c
>>> +++ b/arch/arm/mach-mmp/irq-pxa168.c
>>> @@ -17,6 +17,8 @@
>>>  #include <linux/io.h>
>>>
>>>  #include <mach/regs-icu.h>
>>> +#include <mach/regs-apmu.h>
>>> +#include <mach/cputype.h>
>>>
>>>  #include "common.h"
>>>
>>> @@ -42,6 +44,19 @@ static struct irq_chip icu_irq_chip = {
>>>        .unmask = icu_unmask_irq,
>>>  };
>>>
>>> +void handle_pxa168_keypad_irq(unsigned int irq, struct irq_desc *desc)
>>> +{
>>> +       uint32_t val;
>>> +       uint32_t mask = APMU_PXA168_KP_WAKE_CLR;
>>> +
>>> +       /* clear keypad wake event */
>>> +       val = __raw_readl(APMU_WAKE_CLR);
>>> +       __raw_writel(val |  mask, APMU_WAKE_CLR);
>>> +
>>> +       /* handle irq */
>>> +       handle_level_irq(irq, desc);
>>> +}
>>> +
>>
>> Why should you clear wakeup event status in IRQ handler? If system is
>> resumed by keypad event, you should clear this wakeup source in resume
>> code. I think that IRQ code should not be binded with wakeup event at
>> here.
>>
>>>  void __init icu_init_irq(void)
>>>  {
>>>        int irq;
>>> @@ -49,7 +64,13 @@ void __init icu_init_irq(void)
>>>        for (irq = 0; irq < 64; irq++) {
>>>                icu_mask_irq(irq);
>>>                set_irq_chip(irq, &icu_irq_chip);
>>> -               set_irq_handler(irq, handle_level_irq);
>>> +
>>> +               /* special handler for keypad */
>>> +               if (cpu_is_pxa168() && irq == IRQ_PXA168_KEYPAD)
>>> +                       set_irq_handler(irq, handle_pxa168_keypad_irq);
>>> +               else
>>> +                       set_irq_handler(irq, handle_level_irq);
>>> +
>>>                set_irq_flags(irq, IRQF_VALID);
>>>        }
>>>  }
>>> --
>>> 1.7.0.4
>>>
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>>> the body of a message to [email protected]
>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>> Please read the FAQ at  http://www.tux.org/lkml/
>>>
>>
>
> Haojian, this is an usual case, but without that clear wake event you
> will not be able to clear the keypad interrupt. For my push to open
> source I re-wrote the workaround code and added it as a special case
> IRQ handler. In the Marvell pxa168 code base it is actually located in
> the keypad interrupt handler as the function clear_wakeup(). I felt it
> was better to isolate this code in the mmp common code base instead.

I'd rather the irq handler not being changed and use platform_data instead.
How about something below:

diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h
b/arch/arm/mach-mmp/include/mach/pxa168.h
index 27e1bc7..d2b7946 100644
--- a/arch/arm/mach-mmp/include/mach/pxa168.h
+++ b/arch/arm/mach-mmp/include/mach/pxa168.h
@@ -5,6 +5,7 @@ struct sys_timer;

extern struct sys_timer pxa168_timer;
extern void __init pxa168_init_irq(void);
+extern void pxa168_clear_keypad_wakeup(void);

#include <linux/i2c.h>
#include <mach/devices.h>
@@ -97,4 +98,10 @@ static inline int pxa168_add_nand(struct
pxa3xx_nand_platform_data *info)
{
return pxa_register_device(&pxa168_device_nand, info, sizeof(*info));
}
+
+static inline int pxa168_add_keypad(struct pxa27x_keypad_platform_data *info)
+{
+ info->clear_wakeup = pxa168_clear_keypad_wakeup;
+ return pxa_register_device(&pxa168_device_keypad, info, sizeof(*info));
+}
#endif /* __ASM_MACH_PXA168_H */
diff --git a/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
b/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
index 7b4eadc..3a6bfe7 100644
--- a/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
+++ b/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
@@ -52,6 +52,7 @@ struct pxa27x_keypad_platform_data {

/* key debounce interval */
unsigned int debounce_interval;
+ void (*clear_wakeup);
};

extern void pxa_set_keypad_info(struct pxa27x_keypad_platform_data *info);
diff --git a/drivers/input/keyboard/pxa27x_keypad.c
b/drivers/input/keyboard/pxa27x_keypad.c
index f32404f..3fb94fe 100644
--- a/drivers/input/keyboard/pxa27x_keypad.c
+++ b/drivers/input/keyboard/pxa27x_keypad.c
@@ -330,10 +330,20 @@ static void pxa27x_keypad_scan_direct(struct
pxa27x_keypad *keypad)
keypad->direct_key_state = new_state;
}

+static void clear_wakeup(struct pxa27x_keypad *keypad)
+{
+ struct pxa27x_keypad_platform_data *pdata = keypad->pdata;
+
+ if (pdata->clear_wakeup)
+ (pdata->clear_wakeup)();
+}
+
static irqreturn_t pxa27x_keypad_irq_handler(int irq, void *dev_id)
{
struct pxa27x_keypad *keypad = dev_id;
- unsigned long kpc = keypad_readl(KPC);
+ unsigned long kpc;
+
+ kpc = keypad_readl(KPC);

if (kpc & KPC_DI)
pxa27x_keypad_scan_direct(keypad);

2010-08-31 07:13:08

by Mark F. Brown

[permalink] [raw]
Subject: Re: [PATCH 4/5] ARM: pxa168: added special case handler for keypad interrupts

On Tue, Aug 31, 2010 at 3:05 AM, Eric Miao <[email protected]> wrote:
> On Tue, Aug 31, 2010 at 2:28 PM, Mark F. Brown <[email protected]> wrote:
>> On Tue, Aug 31, 2010 at 12:53 AM, Haojian Zhuang
>> <[email protected]> wrote:
>>> On Thu, Aug 26, 2010 at 5:18 PM, Mark F. Brown <[email protected]> wrote:
>>>> Signed-off-by: Mark F. Brown <[email protected]>
>>>> ---
>>>> ?arch/arm/mach-mmp/irq-pxa168.c | ? 23 ++++++++++++++++++++++-
>>>> ?1 files changed, 22 insertions(+), 1 deletions(-)
>>>>
>>>> diff --git a/arch/arm/mach-mmp/irq-pxa168.c b/arch/arm/mach-mmp/irq-pxa168.c
>>>> index 52ff2f0..bfb0984 100644
>>>> --- a/arch/arm/mach-mmp/irq-pxa168.c
>>>> +++ b/arch/arm/mach-mmp/irq-pxa168.c
>>>> @@ -17,6 +17,8 @@
>>>> ?#include <linux/io.h>
>>>>
>>>> ?#include <mach/regs-icu.h>
>>>> +#include <mach/regs-apmu.h>
>>>> +#include <mach/cputype.h>
>>>>
>>>> ?#include "common.h"
>>>>
>>>> @@ -42,6 +44,19 @@ static struct irq_chip icu_irq_chip = {
>>>> ? ? ? ?.unmask = icu_unmask_irq,
>>>> ?};
>>>>
>>>> +void handle_pxa168_keypad_irq(unsigned int irq, struct irq_desc *desc)
>>>> +{
>>>> + ? ? ? uint32_t val;
>>>> + ? ? ? uint32_t mask = APMU_PXA168_KP_WAKE_CLR;
>>>> +
>>>> + ? ? ? /* clear keypad wake event */
>>>> + ? ? ? val = __raw_readl(APMU_WAKE_CLR);
>>>> + ? ? ? __raw_writel(val | ?mask, APMU_WAKE_CLR);
>>>> +
>>>> + ? ? ? /* handle irq */
>>>> + ? ? ? handle_level_irq(irq, desc);
>>>> +}
>>>> +
>>>
>>> Why should you clear wakeup event status in IRQ handler? If system is
>>> resumed by keypad event, you should clear this wakeup source in resume
>>> code. I think that IRQ code should not be binded with wakeup event at
>>> here.
>>>
>>>> ?void __init icu_init_irq(void)
>>>> ?{
>>>> ? ? ? ?int irq;
>>>> @@ -49,7 +64,13 @@ void __init icu_init_irq(void)
>>>> ? ? ? ?for (irq = 0; irq < 64; irq++) {
>>>> ? ? ? ? ? ? ? ?icu_mask_irq(irq);
>>>> ? ? ? ? ? ? ? ?set_irq_chip(irq, &icu_irq_chip);
>>>> - ? ? ? ? ? ? ? set_irq_handler(irq, handle_level_irq);
>>>> +
>>>> + ? ? ? ? ? ? ? /* special handler for keypad */
>>>> + ? ? ? ? ? ? ? if (cpu_is_pxa168() && irq == IRQ_PXA168_KEYPAD)
>>>> + ? ? ? ? ? ? ? ? ? ? ? set_irq_handler(irq, handle_pxa168_keypad_irq);
>>>> + ? ? ? ? ? ? ? else
>>>> + ? ? ? ? ? ? ? ? ? ? ? set_irq_handler(irq, handle_level_irq);
>>>> +
>>>> ? ? ? ? ? ? ? ?set_irq_flags(irq, IRQF_VALID);
>>>> ? ? ? ?}
>>>> ?}
>>>> --
>>>> 1.7.0.4
>>>>
>>>> --
>>>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>>>> the body of a message to [email protected]
>>>> More majordomo info at ?http://vger.kernel.org/majordomo-info.html
>>>> Please read the FAQ at ?http://www.tux.org/lkml/
>>>>
>>>
>>
>> Haojian, this is an usual case, but without that clear wake event you
>> will not be able to clear the keypad interrupt. For my push to open
>> source I re-wrote the workaround code and added it as a special case
>> IRQ handler. In the Marvell pxa168 code base it is actually located in
>> the keypad interrupt handler as the function clear_wakeup(). I felt it
>> was better to isolate this code in the mmp common code base instead.
>
> I'd rather the irq handler not being changed and use platform_data instead.
> How about something below:
>
> diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h
> b/arch/arm/mach-mmp/include/mach/pxa168.h
> index 27e1bc7..d2b7946 100644
> --- a/arch/arm/mach-mmp/include/mach/pxa168.h
> +++ b/arch/arm/mach-mmp/include/mach/pxa168.h
> @@ -5,6 +5,7 @@ struct sys_timer;
>
> ?extern struct sys_timer pxa168_timer;
> ?extern void __init pxa168_init_irq(void);
> +extern void pxa168_clear_keypad_wakeup(void);
>
> ?#include <linux/i2c.h>
> ?#include <mach/devices.h>
> @@ -97,4 +98,10 @@ static inline int pxa168_add_nand(struct
> pxa3xx_nand_platform_data *info)
> ?{
> ? ? ? ?return pxa_register_device(&pxa168_device_nand, info, sizeof(*info));
> ?}
> +
> +static inline int pxa168_add_keypad(struct pxa27x_keypad_platform_data *info)
> +{
> + ? ? ? info->clear_wakeup = pxa168_clear_keypad_wakeup;
> + ? ? ? return pxa_register_device(&pxa168_device_keypad, info, sizeof(*info));
> +}
> ?#endif /* __ASM_MACH_PXA168_H */
> diff --git a/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
> b/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
> index 7b4eadc..3a6bfe7 100644
> --- a/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
> +++ b/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
> @@ -52,6 +52,7 @@ struct pxa27x_keypad_platform_data {
>
> ? ? ? ?/* key debounce interval */
> ? ? ? ?unsigned int ? ?debounce_interval;
> + ? ? ? void ? ? ? ? ? ?(*clear_wakeup);
> ?};
>
> ?extern void pxa_set_keypad_info(struct pxa27x_keypad_platform_data *info);
> diff --git a/drivers/input/keyboard/pxa27x_keypad.c
> b/drivers/input/keyboard/pxa27x_keypad.c
> index f32404f..3fb94fe 100644
> --- a/drivers/input/keyboard/pxa27x_keypad.c
> +++ b/drivers/input/keyboard/pxa27x_keypad.c
> @@ -330,10 +330,20 @@ static void pxa27x_keypad_scan_direct(struct
> pxa27x_keypad *keypad)
> ? ? ? ?keypad->direct_key_state = new_state;
> ?}
>
> +static void clear_wakeup(struct pxa27x_keypad *keypad)
> +{
> + ? ? ? struct pxa27x_keypad_platform_data *pdata = keypad->pdata;
> +
> + ? ? ? if (pdata->clear_wakeup)
> + ? ? ? ? ? ? ? (pdata->clear_wakeup)();
> +}
> +
> ?static irqreturn_t pxa27x_keypad_irq_handler(int irq, void *dev_id)
> ?{
> ? ? ? ?struct pxa27x_keypad *keypad = dev_id;
> - ? ? ? unsigned long kpc = keypad_readl(KPC);
> + ? ? ? unsigned long kpc;
> +
> + ? ? ? kpc = keypad_readl(KPC);
>
> ? ? ? ?if (kpc & KPC_DI)
> ? ? ? ? ? ? ? ?pxa27x_keypad_scan_direct(keypad);
>

Ok if you are fine with that I will make that change and resubmit!

Regards,
-- Mark

2010-08-31 07:16:08

by Eric Miao

[permalink] [raw]
Subject: Re: [PATCH 4/5] ARM: pxa168: added special case handler for keypad interrupts

On Tue, Aug 31, 2010 at 3:13 PM, Mark F. Brown <[email protected]> wrote:
> On Tue, Aug 31, 2010 at 3:05 AM, Eric Miao <[email protected]> wrote:
>> On Tue, Aug 31, 2010 at 2:28 PM, Mark F. Brown <[email protected]> wrote:
>>> On Tue, Aug 31, 2010 at 12:53 AM, Haojian Zhuang
>>> <[email protected]> wrote:
>>>> On Thu, Aug 26, 2010 at 5:18 PM, Mark F. Brown <[email protected]> wrote:
>>>>> Signed-off-by: Mark F. Brown <[email protected]>
>>>>> ---
>>>>>  arch/arm/mach-mmp/irq-pxa168.c |   23 ++++++++++++++++++++++-
>>>>>  1 files changed, 22 insertions(+), 1 deletions(-)
>>>>>
>>>>> diff --git a/arch/arm/mach-mmp/irq-pxa168.c b/arch/arm/mach-mmp/irq-pxa168.c
>>>>> index 52ff2f0..bfb0984 100644
>>>>> --- a/arch/arm/mach-mmp/irq-pxa168.c
>>>>> +++ b/arch/arm/mach-mmp/irq-pxa168.c
>>>>> @@ -17,6 +17,8 @@
>>>>>  #include <linux/io.h>
>>>>>
>>>>>  #include <mach/regs-icu.h>
>>>>> +#include <mach/regs-apmu.h>
>>>>> +#include <mach/cputype.h>
>>>>>
>>>>>  #include "common.h"
>>>>>
>>>>> @@ -42,6 +44,19 @@ static struct irq_chip icu_irq_chip = {
>>>>>        .unmask = icu_unmask_irq,
>>>>>  };
>>>>>
>>>>> +void handle_pxa168_keypad_irq(unsigned int irq, struct irq_desc *desc)
>>>>> +{
>>>>> +       uint32_t val;
>>>>> +       uint32_t mask = APMU_PXA168_KP_WAKE_CLR;
>>>>> +
>>>>> +       /* clear keypad wake event */
>>>>> +       val = __raw_readl(APMU_WAKE_CLR);
>>>>> +       __raw_writel(val |  mask, APMU_WAKE_CLR);
>>>>> +
>>>>> +       /* handle irq */
>>>>> +       handle_level_irq(irq, desc);
>>>>> +}
>>>>> +
>>>>
>>>> Why should you clear wakeup event status in IRQ handler? If system is
>>>> resumed by keypad event, you should clear this wakeup source in resume
>>>> code. I think that IRQ code should not be binded with wakeup event at
>>>> here.
>>>>
>>>>>  void __init icu_init_irq(void)
>>>>>  {
>>>>>        int irq;
>>>>> @@ -49,7 +64,13 @@ void __init icu_init_irq(void)
>>>>>        for (irq = 0; irq < 64; irq++) {
>>>>>                icu_mask_irq(irq);
>>>>>                set_irq_chip(irq, &icu_irq_chip);
>>>>> -               set_irq_handler(irq, handle_level_irq);
>>>>> +
>>>>> +               /* special handler for keypad */
>>>>> +               if (cpu_is_pxa168() && irq == IRQ_PXA168_KEYPAD)
>>>>> +                       set_irq_handler(irq, handle_pxa168_keypad_irq);
>>>>> +               else
>>>>> +                       set_irq_handler(irq, handle_level_irq);
>>>>> +
>>>>>                set_irq_flags(irq, IRQF_VALID);
>>>>>        }
>>>>>  }
>>>>> --
>>>>> 1.7.0.4
>>>>>
>>>>> --
>>>>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>>>>> the body of a message to [email protected]
>>>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>>>> Please read the FAQ at  http://www.tux.org/lkml/
>>>>>
>>>>
>>>
>>> Haojian, this is an usual case, but without that clear wake event you
>>> will not be able to clear the keypad interrupt. For my push to open
>>> source I re-wrote the workaround code and added it as a special case
>>> IRQ handler. In the Marvell pxa168 code base it is actually located in
>>> the keypad interrupt handler as the function clear_wakeup(). I felt it
>>> was better to isolate this code in the mmp common code base instead.
>>
>> I'd rather the irq handler not being changed and use platform_data instead.
>> How about something below:
>>
>> diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h
>> b/arch/arm/mach-mmp/include/mach/pxa168.h
>> index 27e1bc7..d2b7946 100644
>> --- a/arch/arm/mach-mmp/include/mach/pxa168.h
>> +++ b/arch/arm/mach-mmp/include/mach/pxa168.h
>> @@ -5,6 +5,7 @@ struct sys_timer;
>>
>>  extern struct sys_timer pxa168_timer;
>>  extern void __init pxa168_init_irq(void);
>> +extern void pxa168_clear_keypad_wakeup(void);
>>
>>  #include <linux/i2c.h>
>>  #include <mach/devices.h>
>> @@ -97,4 +98,10 @@ static inline int pxa168_add_nand(struct
>> pxa3xx_nand_platform_data *info)
>>  {
>>        return pxa_register_device(&pxa168_device_nand, info, sizeof(*info));
>>  }
>> +
>> +static inline int pxa168_add_keypad(struct pxa27x_keypad_platform_data *info)
>> +{
>> +       info->clear_wakeup = pxa168_clear_keypad_wakeup;
>> +       return pxa_register_device(&pxa168_device_keypad, info, sizeof(*info));
>> +}
>>  #endif /* __ASM_MACH_PXA168_H */
>> diff --git a/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
>> b/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
>> index 7b4eadc..3a6bfe7 100644
>> --- a/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
>> +++ b/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
>> @@ -52,6 +52,7 @@ struct pxa27x_keypad_platform_data {
>>
>>        /* key debounce interval */
>>        unsigned int    debounce_interval;
>> +       void            (*clear_wakeup);
>>  };
>>
>>  extern void pxa_set_keypad_info(struct pxa27x_keypad_platform_data *info);
>> diff --git a/drivers/input/keyboard/pxa27x_keypad.c
>> b/drivers/input/keyboard/pxa27x_keypad.c
>> index f32404f..3fb94fe 100644
>> --- a/drivers/input/keyboard/pxa27x_keypad.c
>> +++ b/drivers/input/keyboard/pxa27x_keypad.c
>> @@ -330,10 +330,20 @@ static void pxa27x_keypad_scan_direct(struct
>> pxa27x_keypad *keypad)
>>        keypad->direct_key_state = new_state;
>>  }
>>
>> +static void clear_wakeup(struct pxa27x_keypad *keypad)
>> +{
>> +       struct pxa27x_keypad_platform_data *pdata = keypad->pdata;
>> +
>> +       if (pdata->clear_wakeup)
>> +               (pdata->clear_wakeup)();
>> +}
>> +
>>  static irqreturn_t pxa27x_keypad_irq_handler(int irq, void *dev_id)
>>  {
>>        struct pxa27x_keypad *keypad = dev_id;
>> -       unsigned long kpc = keypad_readl(KPC);
>> +       unsigned long kpc;
>> +
>> +       kpc = keypad_readl(KPC);
>>
>>        if (kpc & KPC_DI)
>>                pxa27x_keypad_scan_direct(keypad);
>>
>
> Ok if you are fine with that I will make that change and resubmit!
>

Thanks.