Merge branch 'linus' into x86/i8259
[sfrench/cifs-2.6.git] / drivers / input / keyboard / pxa27x_keypad.c
index 6224c2fb3b65981aec7e6e8386b587d19ebfaf18..45767e73f071e3859ffccebaa7a82d1578019530 100644 (file)
@@ -50,9 +50,9 @@
 #define KPKDI           0x0048
 
 /* bit definitions */
-#define KPC_MKRN(n)    ((((n) & 0x7) - 1) << 26) /* matrix key row number */
-#define KPC_MKCN(n)    ((((n) & 0x7) - 1) << 23) /* matrix key column number */
-#define KPC_DKN(n)     ((((n) & 0x7) - 1) << 6)  /* direct key number */
+#define KPC_MKRN(n)    ((((n) - 1) & 0x7) << 26) /* matrix key row number */
+#define KPC_MKCN(n)    ((((n) - 1) & 0x7) << 23) /* matrix key column number */
+#define KPC_DKN(n)     ((((n) - 1) & 0x7) << 6)  /* direct key number */
 
 #define KPC_AS          (0x1 << 30)  /* Automatic Scan bit */
 #define KPC_ASACT       (0x1 << 29)  /* Automatic Scan on Activity */
@@ -136,6 +136,9 @@ static void pxa27x_keypad_build_keycode(struct pxa27x_keypad *keypad)
                set_bit(code, input_dev->keybit);
        }
 
+       for (i = 0; i < pdata->direct_key_num; i++)
+               set_bit(pdata->direct_key_map[i], input_dev->keybit);
+
        keypad->rotary_up_key[0] = pdata->rotary0_up_key;
        keypad->rotary_up_key[1] = pdata->rotary1_up_key;
        keypad->rotary_down_key[0] = pdata->rotary0_down_key;
@@ -143,17 +146,21 @@ static void pxa27x_keypad_build_keycode(struct pxa27x_keypad *keypad)
        keypad->rotary_rel_code[0] = pdata->rotary0_rel_code;
        keypad->rotary_rel_code[1] = pdata->rotary1_rel_code;
 
-       if (pdata->rotary0_up_key && pdata->rotary0_down_key) {
-               set_bit(pdata->rotary0_up_key, input_dev->keybit);
-               set_bit(pdata->rotary0_down_key, input_dev->keybit);
-       } else
-               set_bit(pdata->rotary0_rel_code, input_dev->relbit);
-
-       if (pdata->rotary1_up_key && pdata->rotary1_down_key) {
-               set_bit(pdata->rotary1_up_key, input_dev->keybit);
-               set_bit(pdata->rotary1_down_key, input_dev->keybit);
-       } else
-               set_bit(pdata->rotary1_rel_code, input_dev->relbit);
+       if (pdata->enable_rotary0) {
+               if (pdata->rotary0_up_key && pdata->rotary0_down_key) {
+                       set_bit(pdata->rotary0_up_key, input_dev->keybit);
+                       set_bit(pdata->rotary0_down_key, input_dev->keybit);
+               } else
+                       set_bit(pdata->rotary0_rel_code, input_dev->relbit);
+       }
+
+       if (pdata->enable_rotary1) {
+               if (pdata->rotary1_up_key && pdata->rotary1_down_key) {
+                       set_bit(pdata->rotary1_up_key, input_dev->keybit);
+                       set_bit(pdata->rotary1_down_key, input_dev->keybit);
+               } else
+                       set_bit(pdata->rotary1_rel_code, input_dev->relbit);
+       }
 }
 
 static inline unsigned int lookup_matrix_keycode(
@@ -484,8 +491,13 @@ static int __devinit pxa27x_keypad_probe(struct platform_device *pdev)
        keypad->input_dev = input_dev;
        input_set_drvdata(input_dev, keypad);
 
-       input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) |
-               BIT_MASK(EV_REL);
+       input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
+       if ((keypad->pdata->enable_rotary0 &&
+                       keypad->pdata->rotary0_rel_code) ||
+           (keypad->pdata->enable_rotary1 &&
+                       keypad->pdata->rotary1_rel_code)) {
+               input_dev->evbit[0] |= BIT_MASK(EV_REL);
+       }
 
        pxa27x_keypad_build_keycode(keypad);
        platform_set_drvdata(pdev, keypad);
@@ -545,6 +557,9 @@ static int __devexit pxa27x_keypad_remove(struct platform_device *pdev)
        return 0;
 }
 
+/* work with hotplug and coldplug */
+MODULE_ALIAS("platform:pxa27x-keypad");
+
 static struct platform_driver pxa27x_keypad_driver = {
        .probe          = pxa27x_keypad_probe,
        .remove         = __devexit_p(pxa27x_keypad_remove),
@@ -552,6 +567,7 @@ static struct platform_driver pxa27x_keypad_driver = {
        .resume         = pxa27x_keypad_resume,
        .driver         = {
                .name   = "pxa27x-keypad",
+               .owner  = THIS_MODULE,
        },
 };