]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00213749: imx6sl: Add keypad support on EINK-DC3 board
authorRobby Cai <R63905@freescale.com>
Tue, 12 Jun 2012 10:24:54 +0000 (18:24 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:34:50 +0000 (08:34 +0200)
Add the support for keypad on EINK-DC3 board which is stacked on ARM2 board.
- configure the iomux setting
- add dummy kpp clock to fool imx_keypad driver
- add platform device for keypad
- add key mapping (4x4 array) used on EINK-DC3
- update the defconfig for keypad driver

Signed-off-by: Robby Cai <R63905@freescale.com>
arch/arm/configs/imx6s_defconfig
arch/arm/mach-mx6/Kconfig
arch/arm/mach-mx6/board-mx6sl_arm2.c
arch/arm/mach-mx6/board-mx6sl_arm2.h
arch/arm/mach-mx6/clock_mx6sl.c
arch/arm/mach-mx6/devices-imx6q.h
arch/arm/plat-mxc/devices/platform-imx-keypad.c
arch/arm/plat-mxc/include/mach/iomux-mx6sl.h
arch/arm/plat-mxc/include/mach/mx6.h

index ffb73c81609c0e42b731481021f51112c8a86dc2..6e8281a4995072e62408bc26ba0c01667b730972 100644 (file)
@@ -260,6 +260,7 @@ CONFIG_IMX_HAVE_PLATFORM_IMX2_WDT=y
 CONFIG_IMX_HAVE_PLATFORM_IMX_SNVS_RTC=y
 CONFIG_IMX_HAVE_PLATFORM_IMX_CAAM=y
 CONFIG_IMX_HAVE_PLATFORM_IMX_I2C=y
+CONFIG_IMX_HAVE_PLATFORM_IMX_KEYPAD=y
 CONFIG_IMX_HAVE_PLATFORM_IMX_SSI=y
 CONFIG_IMX_HAVE_PLATFORM_IMX_ESAI=y
 CONFIG_IMX_HAVE_PLATFORM_IMX_UART=y
@@ -1034,7 +1035,7 @@ CONFIG_KEYBOARD_GPIO=y
 # CONFIG_KEYBOARD_MAX7359 is not set
 # CONFIG_KEYBOARD_MCS is not set
 # CONFIG_KEYBOARD_MPR121 is not set
-# CONFIG_KEYBOARD_IMX is not set
+CONFIG_KEYBOARD_IMX=y
 # CONFIG_KEYBOARD_NEWTON is not set
 # CONFIG_KEYBOARD_OPENCORES is not set
 # CONFIG_KEYBOARD_STOWAWAY is not set
index c6851d064eaabe6af088f7b9ff300868e4899a79..a96597d2d59977e1ce0715fe4c22bb638d3c90a4 100644 (file)
@@ -98,6 +98,7 @@ config MACH_MX6SL_ARM2
        select IMX_HAVE_PLATFORM_IMX_EPDC
        select IMX_HAVE_PLATFORM_IMX_SPDC
        select IMX_HAVE_PLATFORM_IMX_PXP
+       select IMX_HAVE_PLATFORM_IMX_KEYPAD
        help
          Include support for i.MX 6Sololite Armadillo2 platform. This includes specific
          configurations for the board and its peripherals.
index 2d42966dbfb185153d92905131085c31e7873901..b17a0fff464afe42f9d0094d03ea7780eed63143 100755 (executable)
@@ -1042,6 +1042,33 @@ static struct mxc_fb_platform_data fb_data[] = {
 static struct platform_device lcd_wvga_device = {
        .name = "lcd_seiko",
 };
+
+static int mx6sl_arm2_keymap[] = {
+       KEY(0, 0, KEY_SELECT),
+       KEY(0, 1, KEY_BACK),
+       KEY(0, 2, KEY_F1),
+       KEY(0, 3, KEY_F2),
+
+       KEY(1, 0, KEY_F3),
+       KEY(1, 1, KEY_F4),
+       KEY(1, 2, KEY_F5),
+       KEY(1, 3, KEY_MENU),
+
+       KEY(2, 0, KEY_PREVIOUS),
+       KEY(2, 1, KEY_NEXT),
+       KEY(2, 2, KEY_HOME),
+       KEY(2, 3, KEY_NEXT),
+
+       KEY(3, 0, KEY_UP),
+       KEY(3, 1, KEY_LEFT),
+       KEY(3, 2, KEY_RIGHT),
+       KEY(3, 3, KEY_DOWN),
+};
+
+static const struct matrix_keymap_data mx6sl_arm2_map_data __initconst = {
+       .keymap         = mx6sl_arm2_keymap,
+       .keymap_size    = ARRAY_SIZE(mx6sl_arm2_keymap),
+};
 /*!
  * Board specific initialization.
  */
@@ -1118,6 +1145,7 @@ static void __init mx6_arm2_init(void)
        imx6q_add_imx2_wdt(0, NULL);
 
        imx_add_viv_gpu(&imx6_gpu_data, &imx6q_gpu_pdata);
+       imx6sl_add_imx_keypad(&mx6sl_arm2_map_data);
 }
 
 extern void __iomem *twd_base;
index 940c46d0e9847290b68424f9e6bfc20377cc38f8..724f29fc32e093e523aa9d7db6986cfc606a7671 100755 (executable)
@@ -143,6 +143,16 @@ static iomux_v3_cfg_t mx6sl_arm2_pads[] = {
        MX6SL_PAD_PWM1__PWM1_PWMO,
        /* LCD power on */
        MX6SL_PAD_KEY_ROW5__GPIO_4_3,
+
+       /* keypad on E-Ink add-on board */
+       MX6SL_PAD_KEY_COL0__KPP_COL_0,
+       MX6SL_PAD_KEY_COL1__KPP_COL_1,
+       MX6SL_PAD_KEY_COL2__KPP_COL_2,
+       MX6SL_PAD_KEY_COL3__KPP_COL_3,
+       MX6SL_PAD_KEY_ROW0__KPP_ROW_0,
+       MX6SL_PAD_KEY_ROW1__KPP_ROW_1,
+       MX6SL_PAD_KEY_ROW2__KPP_ROW_2,
+       MX6SL_PAD_KEY_ROW3__KPP_ROW_3,
 };
 
 static iomux_v3_cfg_t mx6sl_arm2_epdc_enable_pads[] = {
index 0c17ed4bfd8fbfc2b46e73ae3eda44d08eb6c2b3..e1a4e0032c2fefc3a0507f01273935d269261c9e 100755 (executable)
@@ -3866,6 +3866,7 @@ static struct clk_lookup lookups[] = {
        _REGISTER_CLOCK(NULL, "usb_phy4_clk", usb_phy4_clk),
        _REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk),
        _REGISTER_CLOCK("imx2-wdt.1", NULL, dummy_clk),
+       _REGISTER_CLOCK(NULL, "kpp", dummy_clk),
        _REGISTER_CLOCK(NULL, NULL, aips_tz2_clk),
        _REGISTER_CLOCK(NULL, NULL, aips_tz1_clk),
        _REGISTER_CLOCK(NULL, "clko_clk", clko_clk),
index 6f8b485a35763b8a177d2f232999eb3d6f7a26a6..7695d1253035b06e8038b6355849b87b70f22a8f 100644 (file)
@@ -239,3 +239,6 @@ extern const struct imx_pcie_data imx6q_pcie_data __initconst;
 
 #define imx6q_add_busfreq(pdata)       imx_add_busfreq(pdata)
 
+extern const struct imx_imx_keypad_data imx6sl_imx_keypad_data;
+#define imx6sl_add_imx_keypad(pdata)   \
+       imx_add_imx_keypad(&imx6sl_imx_keypad_data, pdata)
index 26366114b021aadc9cb49173de6c70c0d4e6227c..1a120218d05c5997c2d2ed2eb5d4fddc32f4f9da 100644 (file)
@@ -46,6 +46,11 @@ const struct imx_imx_keypad_data imx51_imx_keypad_data __initconst =
        imx_imx_keypad_data_entry_single(MX51, SZ_16);
 #endif /* ifdef CONFIG_SOC_IMX51 */
 
+#ifdef CONFIG_SOC_IMX6SL
+const struct imx_imx_keypad_data imx6sl_imx_keypad_data __initconst =
+       imx_imx_keypad_data_entry_single(MX6SL, SZ_16);
+#endif /* ifdef CONFIG_SOC_IMX6SL */
+
 struct platform_device *__init imx_add_imx_keypad(
                const struct imx_imx_keypad_data *data,
                const struct matrix_keymap_data *pdata)
index 5ce23184a540d7ef5364a2b332e4af2f4fda33c8..00734c9c028977ccc7f27b154b39ccc9a4c51f08 100755 (executable)
@@ -69,6 +69,9 @@
                                PAD_CTL_PUE | PAD_CTL_PKE |             \
                                PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm)
 
+#define MX6SL_KEYPAD_CTRL      (PAD_CTL_HYS | PAD_CTL_PKE | PAD_CTL_PUE | \
+                               PAD_CTL_PUS_100K_UP | PAD_CTL_DSE_120ohm)
+
 #define MX6SL_PAD_AUD_MCLK__AUDMUX_AUDIO_CLK_OUT                              \
                IOMUX_PAD(0x02A4, 0x004C, 0, 0x0000, 0, NO_PAD_CTRL)
 #define MX6SL_PAD_AUD_MCLK__PWM4_PWMO                                         \
                IOMUX_PAD(0x0490, 0x0188, 7, 0x0000, 0, NO_PAD_CTRL)
 
 #define MX6SL_PAD_KEY_ROW0__KPP_ROW_0                                         \
-               IOMUX_PAD(0x0494, 0x018C, 0, 0x0754, 0, NO_PAD_CTRL)
+               IOMUX_PAD(0x0494, 0x018C, 0, 0x0754, 0, MX6SL_KEYPAD_CTRL)
 #define MX6SL_PAD_KEY_ROW0__I2C2_SDA                                          \
                IOMUX_PAD(0x0494, 0x018C, 1 | IOMUX_CONFIG_SION, 0x0728, 2, MX6SL_I2C_PAD_CTRL)
 #define MX6SL_PAD_KEY_ROW0__LCDIF_DAT_1                                       \
                IOMUX_PAD(0x0494, 0x018C, 7, 0x0000, 0, NO_PAD_CTRL)
 
 #define MX6SL_PAD_KEY_ROW1__KPP_ROW_1                                         \
-               IOMUX_PAD(0x0498, 0x0190, 0, 0x0758, 0, NO_PAD_CTRL)
+               IOMUX_PAD(0x0498, 0x0190, 0, 0x0758, 0, MX6SL_KEYPAD_CTRL)
 #define MX6SL_PAD_KEY_ROW1__ECSPI4_MISO                                       \
                IOMUX_PAD(0x0498, 0x0190, 1, 0x06D4, 2, NO_PAD_CTRL)
 #define MX6SL_PAD_KEY_ROW1__LCDIF_DAT_3                                       \
                IOMUX_PAD(0x0498, 0x0190, 7, 0x0000, 0, NO_PAD_CTRL)
 
 #define MX6SL_PAD_KEY_ROW2__KPP_ROW_2                                         \
-               IOMUX_PAD(0x049C, 0x0194, 0, 0x075C, 0, NO_PAD_CTRL)
+               IOMUX_PAD(0x049C, 0x0194, 0, 0x075C, 0, MX6SL_KEYPAD_CTRL)
 #define MX6SL_PAD_KEY_ROW2__ECSPI4_SCLK                                       \
                IOMUX_PAD(0x049C, 0x0194, 1, 0x06D0, 2, NO_PAD_CTRL)
 #define MX6SL_PAD_KEY_ROW2__LCDIF_DAT_5                                       \
                IOMUX_PAD(0x049C, 0x0194, 7, 0x0000, 0, NO_PAD_CTRL)
 
 #define MX6SL_PAD_KEY_ROW3__KPP_ROW_3                                         \
-               IOMUX_PAD(0x04A0, 0x0198, 0, 0x0760, 0, NO_PAD_CTRL)
+               IOMUX_PAD(0x04A0, 0x0198, 0, 0x0760, 0, MX6SL_KEYPAD_CTRL)
 #define MX6SL_PAD_KEY_ROW3__AUDMUX_AUD6_RXC                                   \
                IOMUX_PAD(0x04A0, 0x0198, 1, 0x061C, 1, NO_PAD_CTRL)
 #define MX6SL_PAD_KEY_ROW3__LCDIF_DAT_7                                       \
index 51c047acf8bc3e0713537bf9b6d3d2052fa2f588..bb4423e200636ecdae9151c4787dbe745da698ae 100644 (file)
 #define GPIO5_BASE_ADDR                        (AIPS1_OFF_BASE_ADDR + 0x2C000)
 #define GPIO6_BASE_ADDR                        (AIPS1_OFF_BASE_ADDR + 0x30000)
 #define GPIO7_BASE_ADDR                        (AIPS1_OFF_BASE_ADDR + 0x34000)
-#define KPP_BASE_ADDR                  (AIPS1_OFF_BASE_ADDR + 0x38000)
+#define MX6SL_KPP_BASE_ADDR            (AIPS1_OFF_BASE_ADDR + 0x38000)
 #define MX6Q_WDOG1_BASE_ADDR           (AIPS1_OFF_BASE_ADDR + 0x3C000)
 #define MX6Q_WDOG2_BASE_ADDR           (AIPS1_OFF_BASE_ADDR + 0x40000)
 #define CCM_BASE_ADDR                  (AIPS1_OFF_BASE_ADDR + 0x44000)
 #define MXC_INT_WDOG1                  112
 #define MXC_INT_WDOG2                  113
 #define MXC_INT_KPP                    114
+#define MX6SL_INT_KPP                  114
 #define MX6Q_INT_PWM1                  115
 #define MX6Q_INT_PWM2                  116
 #define MX6Q_INT_PWM3                  117