Input: spear-keyboard - configure device according to supplied mode
authorRajeev Kumar <rajeev-dlh.kumar@st.com>
Fri, 24 Feb 2012 08:51:40 +0000 (00:51 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 28 Feb 2012 09:18:32 +0000 (01:18 -0800)
Let platform pass mode information to keyboard driver according to which
it configures itself. The mode can be
 - KEYPAD_9x9     0
 - KEYPAD_6x6     1
 - KEYPAD_2x2     2

Signed-off-by: Rajeev Kumar <rajeev-dlh.kumar@st.com>
Signed-off-by: Viresh Kumar <viresh.kumar@st.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
arch/arm/plat-spear/include/plat/keyboard.h
drivers/input/keyboard/spear-keyboard.c

index 130c045a5b893c8e591985d2b31d62c240de4e52..c16cc31ecbed6fcb1c28e3a1b2e6f51e16df9bca 100644 (file)
@@ -140,10 +140,15 @@ int _name[] = { \
        KEY(5, 5, KEY_ZENKAKUHANKAKU), \
 }
 
+#define KEYPAD_9x9     0
+#define KEYPAD_6x6     1
+#define KEYPAD_2x2     2
+
 /**
  * struct kbd_platform_data - spear keyboard platform data
  * keymap: pointer to keymap data (table and size)
  * rep: enables key autorepeat
+ * mode: choose keyboard support(9x9, 6x6, 2x2)
  *
  * This structure is supposed to be used by platform code to supply
  * keymaps to drivers that implement keyboards.
@@ -151,6 +156,7 @@ int _name[] = { \
 struct kbd_platform_data {
        const struct matrix_keymap_data *keymap;
        bool rep;
+       unsigned int mode;
 };
 
 /* This function is used to set platform data field of pdev->dev */
index c88bd63dc9ccc0f582fde988ce129609b7477556..933fb019b967dd5ff0283143fe28d2769e464f76 100644 (file)
@@ -50,6 +50,7 @@
 #define ROW_MASK       0xF0
 #define COLUMN_MASK    0x0F
 #define ROW_SHIFT      4
+#define KEY_MATRIX_SHIFT       6
 
 struct spear_kbd {
        struct input_dev *input;
@@ -57,6 +58,7 @@ struct spear_kbd {
        void __iomem *io_base;
        struct clk *clk;
        unsigned int irq;
+       unsigned int mode;
        unsigned short last_key;
        unsigned short keycodes[256];
 };
@@ -106,7 +108,8 @@ static int spear_kbd_open(struct input_dev *dev)
                return error;
 
        /* program keyboard */
-       val = SCAN_RATE_80 | MODE_KEYBOARD | PCLK_FREQ_MSK;
+       val = SCAN_RATE_80 | MODE_KEYBOARD | PCLK_FREQ_MSK |
+               (kbd->mode << KEY_MATRIX_SHIFT);
        writew(val, kbd->io_base + MODE_REG);
        writeb(1, kbd->io_base + STATUS_REG);
 
@@ -176,6 +179,8 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
 
        kbd->input = input_dev;
        kbd->irq = irq;
+       kbd->mode = pdata->mode;
+
        kbd->res = request_mem_region(res->start, resource_size(res),
                                      pdev->name);
        if (!kbd->res) {