Commit 990c09d5f5b2079e8bf3c6615c78fa5ed2b97147

Authored by Miguel Aguilar
Committed by Kevin Hilman
1 parent 1ce52121c4

Davinci: DM365: Enable DaVinci Key Scan support for DM365 EVM

The general structures are defined at DM365 SoC file and the specific
platform data structure for the EVM is defined at board file.

Signed-off-by: Miguel Aguilar <miguel.aguilar@ridgerun.com>

Showing 4 changed files with 76 additions and 3 deletions Side-by-side Diff

arch/arm/mach-davinci/board-dm365-evm.c
... ... @@ -23,6 +23,7 @@
23 23 #include <linux/mtd/mtd.h>
24 24 #include <linux/mtd/partitions.h>
25 25 #include <linux/mtd/nand.h>
  26 +#include <linux/input.h>
26 27  
27 28 #include <asm/mach-types.h>
28 29 #include <asm/mach/arch.h>
... ... @@ -34,6 +35,7 @@
34 35 #include <mach/serial.h>
35 36 #include <mach/mmc.h>
36 37 #include <mach/nand.h>
  38 +#include <mach/keyscan.h>
37 39  
38 40 static inline int have_imager(void)
39 41 {
... ... @@ -190,6 +192,38 @@
190 192 .bus_delay = 0 /* usec */,
191 193 };
192 194  
  195 +#ifdef CONFIG_KEYBOARD_DAVINCI
  196 +static unsigned short dm365evm_keymap[] = {
  197 + KEY_KP2,
  198 + KEY_LEFT,
  199 + KEY_EXIT,
  200 + KEY_DOWN,
  201 + KEY_ENTER,
  202 + KEY_UP,
  203 + KEY_KP1,
  204 + KEY_RIGHT,
  205 + KEY_MENU,
  206 + KEY_RECORD,
  207 + KEY_REWIND,
  208 + KEY_KPMINUS,
  209 + KEY_STOP,
  210 + KEY_FASTFORWARD,
  211 + KEY_KPPLUS,
  212 + KEY_PLAYPAUSE,
  213 + 0
  214 +};
  215 +
  216 +static struct davinci_ks_platform_data dm365evm_ks_data = {
  217 + .keymap = dm365evm_keymap,
  218 + .keymapsize = ARRAY_SIZE(dm365evm_keymap),
  219 + .rep = 1,
  220 + /* Scan period = strobe + interval */
  221 + .strobe = 0x5,
  222 + .interval = 0x2,
  223 + .matrix_type = DAVINCI_KEYSCAN_MATRIX_4X4,
  224 +};
  225 +#endif
  226 +
193 227 static int cpld_mmc_get_cd(int module)
194 228 {
195 229 if (!cpld)
... ... @@ -476,6 +510,10 @@
476 510 evm_init_cpld();
477 511  
478 512 dm365_init_asp(&dm365_evm_snd_data);
  513 +
  514 +#ifdef CONFIG_KEYBOARD_DAVINCI
  515 + dm365_init_ks(&dm365evm_ks_data);
  516 +#endif
479 517 }
480 518  
481 519 static __init void dm365_evm_irq_init(void)
arch/arm/mach-davinci/dm365.c
... ... @@ -31,6 +31,7 @@
31 31 #include <mach/serial.h>
32 32 #include <mach/common.h>
33 33 #include <mach/asp.h>
  34 +#include <mach/keyscan.h>
34 35  
35 36 #include "clock.h"
36 37 #include "mux.h"
... ... @@ -530,7 +531,7 @@
530 531 MUX_CFG(DM365, EMAC_MDIO, 3, 1, 1, 1, false)
531 532 MUX_CFG(DM365, EMAC_MDCLK, 3, 0, 1, 1, false)
532 533  
533   -MUX_CFG(DM365, KEYPAD, 2, 0, 0x3f, 0x3f, false)
  534 +MUX_CFG(DM365, KEYSCAN, 2, 0, 0x3f, 0x3f, false)
534 535  
535 536 MUX_CFG(DM365, PWM0, 1, 0, 3, 2, false)
536 537 MUX_CFG(DM365, PWM0_G23, 3, 26, 3, 3, false)
... ... @@ -849,6 +850,28 @@
849 850 },
850 851 };
851 852  
  853 +static struct resource dm365_ks_resources[] = {
  854 + {
  855 + /* registers */
  856 + .start = DM365_KEYSCAN_BASE,
  857 + .end = DM365_KEYSCAN_BASE + SZ_1K - 1,
  858 + .flags = IORESOURCE_MEM,
  859 + },
  860 + {
  861 + /* interrupt */
  862 + .start = IRQ_DM365_KEYINT,
  863 + .end = IRQ_DM365_KEYINT,
  864 + .flags = IORESOURCE_IRQ,
  865 + },
  866 +};
  867 +
  868 +static struct platform_device dm365_ks_device = {
  869 + .name = "davinci_keyscan",
  870 + .id = 0,
  871 + .num_resources = ARRAY_SIZE(dm365_ks_resources),
  872 + .resource = dm365_ks_resources,
  873 +};
  874 +
852 875 /* Contents of JTAG ID register used to identify exact cpu type */
853 876 static struct davinci_id dm365_ids[] = {
854 877 {
... ... @@ -946,6 +969,13 @@
946 969 davinci_cfg_reg(DM365_EVT3_ASP_RX);
947 970 dm365_asp_device.dev.platform_data = pdata;
948 971 platform_device_register(&dm365_asp_device);
  972 +}
  973 +
  974 +void __init dm365_init_ks(struct davinci_ks_platform_data *pdata)
  975 +{
  976 + davinci_cfg_reg(DM365_KEYSCAN);
  977 + dm365_ks_device.dev.platform_data = pdata;
  978 + platform_device_register(&dm365_ks_device);
949 979 }
950 980  
951 981 void __init dm365_init(void)
arch/arm/mach-davinci/include/mach/dm365.h
... ... @@ -17,6 +17,7 @@
17 17 #include <mach/hardware.h>
18 18 #include <mach/emac.h>
19 19 #include <mach/asp.h>
  20 +#include <mach/keyscan.h>
20 21  
21 22 #define DM365_EMAC_BASE (0x01D07000)
22 23 #define DM365_EMAC_CNTRL_OFFSET (0x0000)
23 24  
... ... @@ -25,8 +26,12 @@
25 26 #define DM365_EMAC_MDIO_OFFSET (0x4000)
26 27 #define DM365_EMAC_CNTRL_RAM_SIZE (0x2000)
27 28  
  29 +/* Base of key scan register bank */
  30 +#define DM365_KEYSCAN_BASE (0x01C69400)
  31 +
28 32 void __init dm365_init(void);
29 33 void __init dm365_init_asp(struct snd_platform_data *pdata);
  34 +void __init dm365_init_ks(struct davinci_ks_platform_data *pdata);
30 35  
31 36 #endif /* __ASM_ARCH_DM365_H */
arch/arm/mach-davinci/include/mach/mux.h
... ... @@ -237,8 +237,8 @@
237 237 DM365_EMAC_MDIO,
238 238 DM365_EMAC_MDCLK,
239 239  
240   - /* Keypad */
241   - DM365_KEYPAD,
  240 + /* Key Scan */
  241 + DM365_KEYSCAN,
242 242  
243 243 /* PWM */
244 244 DM365_PWM0,