Commit 990c09d5 authored by Miguel Aguilar's avatar Miguel Aguilar Committed by Kevin Hilman

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: default avatarMiguel Aguilar <miguel.aguilar@ridgerun.com>
parent 1ce52121
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/mtd/nand.h> #include <linux/mtd/nand.h>
#include <linux/input.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
...@@ -34,6 +35,7 @@ ...@@ -34,6 +35,7 @@
#include <mach/serial.h> #include <mach/serial.h>
#include <mach/mmc.h> #include <mach/mmc.h>
#include <mach/nand.h> #include <mach/nand.h>
#include <mach/keyscan.h>
static inline int have_imager(void) static inline int have_imager(void)
{ {
...@@ -190,6 +192,38 @@ static struct davinci_i2c_platform_data i2c_pdata = { ...@@ -190,6 +192,38 @@ static struct davinci_i2c_platform_data i2c_pdata = {
.bus_delay = 0 /* usec */, .bus_delay = 0 /* usec */,
}; };
#ifdef CONFIG_KEYBOARD_DAVINCI
static unsigned short dm365evm_keymap[] = {
KEY_KP2,
KEY_LEFT,
KEY_EXIT,
KEY_DOWN,
KEY_ENTER,
KEY_UP,
KEY_KP1,
KEY_RIGHT,
KEY_MENU,
KEY_RECORD,
KEY_REWIND,
KEY_KPMINUS,
KEY_STOP,
KEY_FASTFORWARD,
KEY_KPPLUS,
KEY_PLAYPAUSE,
0
};
static struct davinci_ks_platform_data dm365evm_ks_data = {
.keymap = dm365evm_keymap,
.keymapsize = ARRAY_SIZE(dm365evm_keymap),
.rep = 1,
/* Scan period = strobe + interval */
.strobe = 0x5,
.interval = 0x2,
.matrix_type = DAVINCI_KEYSCAN_MATRIX_4X4,
};
#endif
static int cpld_mmc_get_cd(int module) static int cpld_mmc_get_cd(int module)
{ {
if (!cpld) if (!cpld)
...@@ -476,6 +510,10 @@ static __init void dm365_evm_init(void) ...@@ -476,6 +510,10 @@ static __init void dm365_evm_init(void)
evm_init_cpld(); evm_init_cpld();
dm365_init_asp(&dm365_evm_snd_data); dm365_init_asp(&dm365_evm_snd_data);
#ifdef CONFIG_KEYBOARD_DAVINCI
dm365_init_ks(&dm365evm_ks_data);
#endif
} }
static __init void dm365_evm_irq_init(void) static __init void dm365_evm_irq_init(void)
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <mach/serial.h> #include <mach/serial.h>
#include <mach/common.h> #include <mach/common.h>
#include <mach/asp.h> #include <mach/asp.h>
#include <mach/keyscan.h>
#include "clock.h" #include "clock.h"
#include "mux.h" #include "mux.h"
...@@ -530,7 +531,7 @@ MUX_CFG(DM365, EMAC_CRS, 3, 2, 1, 1, false) ...@@ -530,7 +531,7 @@ MUX_CFG(DM365, EMAC_CRS, 3, 2, 1, 1, false)
MUX_CFG(DM365, EMAC_MDIO, 3, 1, 1, 1, false) MUX_CFG(DM365, EMAC_MDIO, 3, 1, 1, 1, false)
MUX_CFG(DM365, EMAC_MDCLK, 3, 0, 1, 1, false) MUX_CFG(DM365, EMAC_MDCLK, 3, 0, 1, 1, false)
MUX_CFG(DM365, KEYPAD, 2, 0, 0x3f, 0x3f, false) MUX_CFG(DM365, KEYSCAN, 2, 0, 0x3f, 0x3f, false)
MUX_CFG(DM365, PWM0, 1, 0, 3, 2, false) MUX_CFG(DM365, PWM0, 1, 0, 3, 2, false)
MUX_CFG(DM365, PWM0_G23, 3, 26, 3, 3, false) MUX_CFG(DM365, PWM0_G23, 3, 26, 3, 3, false)
...@@ -849,6 +850,28 @@ static struct map_desc dm365_io_desc[] = { ...@@ -849,6 +850,28 @@ static struct map_desc dm365_io_desc[] = {
}, },
}; };
static struct resource dm365_ks_resources[] = {
{
/* registers */
.start = DM365_KEYSCAN_BASE,
.end = DM365_KEYSCAN_BASE + SZ_1K - 1,
.flags = IORESOURCE_MEM,
},
{
/* interrupt */
.start = IRQ_DM365_KEYINT,
.end = IRQ_DM365_KEYINT,
.flags = IORESOURCE_IRQ,
},
};
static struct platform_device dm365_ks_device = {
.name = "davinci_keyscan",
.id = 0,
.num_resources = ARRAY_SIZE(dm365_ks_resources),
.resource = dm365_ks_resources,
};
/* Contents of JTAG ID register used to identify exact cpu type */ /* Contents of JTAG ID register used to identify exact cpu type */
static struct davinci_id dm365_ids[] = { static struct davinci_id dm365_ids[] = {
{ {
...@@ -948,6 +971,13 @@ void __init dm365_init_asp(struct snd_platform_data *pdata) ...@@ -948,6 +971,13 @@ void __init dm365_init_asp(struct snd_platform_data *pdata)
platform_device_register(&dm365_asp_device); platform_device_register(&dm365_asp_device);
} }
void __init dm365_init_ks(struct davinci_ks_platform_data *pdata)
{
davinci_cfg_reg(DM365_KEYSCAN);
dm365_ks_device.dev.platform_data = pdata;
platform_device_register(&dm365_ks_device);
}
void __init dm365_init(void) void __init dm365_init(void)
{ {
davinci_common_init(&davinci_soc_info_dm365); davinci_common_init(&davinci_soc_info_dm365);
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/emac.h> #include <mach/emac.h>
#include <mach/asp.h> #include <mach/asp.h>
#include <mach/keyscan.h>
#define DM365_EMAC_BASE (0x01D07000) #define DM365_EMAC_BASE (0x01D07000)
#define DM365_EMAC_CNTRL_OFFSET (0x0000) #define DM365_EMAC_CNTRL_OFFSET (0x0000)
...@@ -25,7 +26,11 @@ ...@@ -25,7 +26,11 @@
#define DM365_EMAC_MDIO_OFFSET (0x4000) #define DM365_EMAC_MDIO_OFFSET (0x4000)
#define DM365_EMAC_CNTRL_RAM_SIZE (0x2000) #define DM365_EMAC_CNTRL_RAM_SIZE (0x2000)
/* Base of key scan register bank */
#define DM365_KEYSCAN_BASE (0x01C69400)
void __init dm365_init(void); void __init dm365_init(void);
void __init dm365_init_asp(struct snd_platform_data *pdata); void __init dm365_init_asp(struct snd_platform_data *pdata);
void __init dm365_init_ks(struct davinci_ks_platform_data *pdata);
#endif /* __ASM_ARCH_DM365_H */ #endif /* __ASM_ARCH_DM365_H */
...@@ -237,8 +237,8 @@ enum davinci_dm365_index { ...@@ -237,8 +237,8 @@ enum davinci_dm365_index {
DM365_EMAC_MDIO, DM365_EMAC_MDIO,
DM365_EMAC_MDCLK, DM365_EMAC_MDCLK,
/* Keypad */ /* Key Scan */
DM365_KEYPAD, DM365_KEYSCAN,
/* PWM */ /* PWM */
DM365_PWM0, DM365_PWM0,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment