The ChromeOS EC keyboard is used by various different chromebooks. Peach
pi being the third board in the u-boot tree to use it (snow and peach
pit the other two). Rather then embedding the same big DT node in the
peach-pi DT again, copy the dtsi snippit & bindings documentation from
linux and include it in all 3 boards.

This slightly changes the dt bindings in u-boot:
  * google,key-rows becomes keypad,num-rows
  * google,key-colums becomes keypad,num-colums
  * google,repeat-delay-ms and google,repeat-rate-ms are no longer used
    and replaced by hardcoded values (similar to tegra kbc)

Signed-off-by: Sjoerd Simons <sjoerd.sim...@collabora.co.uk>
---
 arch/arm/dts/cros-ec-keyboard.dtsi              | 105 ++++++++++++++++++++++++
 arch/arm/dts/exynos5250-snow.dts                |  59 +------------
 arch/arm/dts/exynos5420-peach-pit.dts           |  59 +------------
 arch/arm/dts/exynos5800-peach-pi.dts            |   4 +-
 doc/device-tree-bindings/input/cros-ec-keyb.txt |  53 ++++++------
 drivers/input/cros_ec_keyb.c                    |  16 ++--
 6 files changed, 143 insertions(+), 153 deletions(-)
 create mode 100644 arch/arm/dts/cros-ec-keyboard.dtsi

diff --git a/arch/arm/dts/cros-ec-keyboard.dtsi 
b/arch/arm/dts/cros-ec-keyboard.dtsi
new file mode 100644
index 0000000..9c7fb0a
--- /dev/null
+++ b/arch/arm/dts/cros-ec-keyboard.dtsi
@@ -0,0 +1,105 @@
+/*
+ * Keyboard dts fragment for devices that use cros-ec-keyboard
+ *
+ * Copyright (c) 2014 Google, Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+#include <dt-bindings/input/input.h>
+
+&cros_ec {
+       keyboard-controller {
+               compatible = "google,cros-ec-keyb";
+               keypad,num-rows = <8>;
+               keypad,num-columns = <13>;
+               google,needs-ghost-filter;
+
+               linux,keymap = <
+                       MATRIX_KEY(0x00, 0x01, KEY_LEFTMETA)
+                       MATRIX_KEY(0x00, 0x02, KEY_F1)
+                       MATRIX_KEY(0x00, 0x03, KEY_B)
+                       MATRIX_KEY(0x00, 0x04, KEY_F10)
+                       MATRIX_KEY(0x00, 0x06, KEY_N)
+                       MATRIX_KEY(0x00, 0x08, KEY_EQUAL)
+                       MATRIX_KEY(0x00, 0x0a, KEY_RIGHTALT)
+
+                       MATRIX_KEY(0x01, 0x01, KEY_ESC)
+                       MATRIX_KEY(0x01, 0x02, KEY_F4)
+                       MATRIX_KEY(0x01, 0x03, KEY_G)
+                       MATRIX_KEY(0x01, 0x04, KEY_F7)
+                       MATRIX_KEY(0x01, 0x06, KEY_H)
+                       MATRIX_KEY(0x01, 0x08, KEY_APOSTROPHE)
+                       MATRIX_KEY(0x01, 0x09, KEY_F9)
+                       MATRIX_KEY(0x01, 0x0b, KEY_BACKSPACE)
+
+                       MATRIX_KEY(0x02, 0x00, KEY_LEFTCTRL)
+                       MATRIX_KEY(0x02, 0x01, KEY_TAB)
+                       MATRIX_KEY(0x02, 0x02, KEY_F3)
+                       MATRIX_KEY(0x02, 0x03, KEY_T)
+                       MATRIX_KEY(0x02, 0x04, KEY_F6)
+                       MATRIX_KEY(0x02, 0x05, KEY_RIGHTBRACE)
+                       MATRIX_KEY(0x02, 0x06, KEY_Y)
+                       MATRIX_KEY(0x02, 0x07, KEY_102ND)
+                       MATRIX_KEY(0x02, 0x08, KEY_LEFTBRACE)
+                       MATRIX_KEY(0x02, 0x09, KEY_F8)
+
+                       MATRIX_KEY(0x03, 0x01, KEY_GRAVE)
+                       MATRIX_KEY(0x03, 0x02, KEY_F2)
+                       MATRIX_KEY(0x03, 0x03, KEY_5)
+                       MATRIX_KEY(0x03, 0x04, KEY_F5)
+                       MATRIX_KEY(0x03, 0x06, KEY_6)
+                       MATRIX_KEY(0x03, 0x08, KEY_MINUS)
+                       MATRIX_KEY(0x03, 0x0b, KEY_BACKSLASH)
+
+                       MATRIX_KEY(0x04, 0x00, KEY_RIGHTCTRL)
+                       MATRIX_KEY(0x04, 0x01, KEY_A)
+                       MATRIX_KEY(0x04, 0x02, KEY_D)
+                       MATRIX_KEY(0x04, 0x03, KEY_F)
+                       MATRIX_KEY(0x04, 0x04, KEY_S)
+                       MATRIX_KEY(0x04, 0x05, KEY_K)
+                       MATRIX_KEY(0x04, 0x06, KEY_J)
+                       MATRIX_KEY(0x04, 0x08, KEY_SEMICOLON)
+                       MATRIX_KEY(0x04, 0x09, KEY_L)
+                       MATRIX_KEY(0x04, 0x0a, KEY_BACKSLASH)
+                       MATRIX_KEY(0x04, 0x0b, KEY_ENTER)
+
+                       MATRIX_KEY(0x05, 0x01, KEY_Z)
+                       MATRIX_KEY(0x05, 0x02, KEY_C)
+                       MATRIX_KEY(0x05, 0x03, KEY_V)
+                       MATRIX_KEY(0x05, 0x04, KEY_X)
+                       MATRIX_KEY(0x05, 0x05, KEY_COMMA)
+                       MATRIX_KEY(0x05, 0x06, KEY_M)
+                       MATRIX_KEY(0x05, 0x07, KEY_LEFTSHIFT)
+                       MATRIX_KEY(0x05, 0x08, KEY_SLASH)
+                       MATRIX_KEY(0x05, 0x09, KEY_DOT)
+                       MATRIX_KEY(0x05, 0x0b, KEY_SPACE)
+
+                       MATRIX_KEY(0x06, 0x01, KEY_1)
+                       MATRIX_KEY(0x06, 0x02, KEY_3)
+                       MATRIX_KEY(0x06, 0x03, KEY_4)
+                       MATRIX_KEY(0x06, 0x04, KEY_2)
+                       MATRIX_KEY(0x06, 0x05, KEY_8)
+                       MATRIX_KEY(0x06, 0x06, KEY_7)
+                       MATRIX_KEY(0x06, 0x08, KEY_0)
+                       MATRIX_KEY(0x06, 0x09, KEY_9)
+                       MATRIX_KEY(0x06, 0x0a, KEY_LEFTALT)
+                       MATRIX_KEY(0x06, 0x0b, KEY_DOWN)
+                       MATRIX_KEY(0x06, 0x0c, KEY_RIGHT)
+
+                       MATRIX_KEY(0x07, 0x01, KEY_Q)
+                       MATRIX_KEY(0x07, 0x02, KEY_E)
+                       MATRIX_KEY(0x07, 0x03, KEY_R)
+                       MATRIX_KEY(0x07, 0x04, KEY_W)
+                       MATRIX_KEY(0x07, 0x05, KEY_I)
+                       MATRIX_KEY(0x07, 0x06, KEY_U)
+                       MATRIX_KEY(0x07, 0x07, KEY_RIGHTSHIFT)
+                       MATRIX_KEY(0x07, 0x08, KEY_P)
+                       MATRIX_KEY(0x07, 0x09, KEY_O)
+                       MATRIX_KEY(0x07, 0x0b, KEY_UP)
+                       MATRIX_KEY(0x07, 0x0c, KEY_LEFT)
+               >;
+       };
+};
diff --git a/arch/arm/dts/exynos5250-snow.dts b/arch/arm/dts/exynos5250-snow.dts
index 95af025..bac5015 100644
--- a/arch/arm/dts/exynos5250-snow.dts
+++ b/arch/arm/dts/exynos5250-snow.dts
@@ -64,7 +64,7 @@
        spi@131b0000 {
                spi-max-frequency = <1000000>;
                spi-deactivate-delay = <100>;
-               cros-ec@0 {
+               cros_ec: cros-ec@0 {
                        reg = <0>;
                        compatible = "google,cros-ec";
                        spi-max-frequency = <5000000>;
@@ -151,61 +151,6 @@
                samsung,dc-value        = <25>;
        };
 
-       cros-ec-keyb {
-               compatible = "google,cros-ec-keyb";
-               google,key-rows = <8>;
-               google,key-columns = <13>;
-               google,repeat-delay-ms = <240>;
-               google,repeat-rate-ms = <30>;
-               google,ghost-filter;
-               /*
-                * Keymap entries take the form of 0xRRCCKKKK where
-                * RR=Row CC=Column KKKK=Key Code
-                * The values below are for a US keyboard layout and
-                * are taken from the Linux driver. Note that the
-                * 102ND key is not used for US keyboards.
-                */
-               linux,keymap = <
-                       /* CAPSLCK F1         B          F10     */
-                       0x0001003a 0x0002003b 0x00030030 0x00040044
-                       /* N       =          R_ALT      ESC     */
-                       0x00060031 0x0008000d 0x000a0064 0x01010001
-                       /* F4      G          F7         H       */
-                       0x0102003e 0x01030022 0x01040041 0x01060023
-                       /* '       F9         BKSPACE    L_CTRL  */
-                       0x01080028 0x01090043 0x010b000e 0x0200001d
-                       /* TAB     F3         T          F6      */
-                       0x0201000f 0x0202003d 0x02030014 0x02040040
-                       /* ]       Y          102ND      [       */
-                       0x0205001b 0x02060015 0x02070056 0x0208001a
-                       /* F8      GRAVE      F2         5       */
-                       0x02090042 0x03010029 0x0302003c 0x03030006
-                       /* F5      6          -          \       */
-                       0x0304003f 0x03060007 0x0308000c 0x030b002b
-                       /* R_CTRL  A          D          F       */
-                       0x04000061 0x0401001e 0x04020020 0x04030021
-                       /* S       K          J          ;       */
-                       0x0404001f 0x04050025 0x04060024 0x04080027
-                       /* L       ENTER      Z          C       */
-                       0x04090026 0x040b001c 0x0501002c 0x0502002e
-                       /* V       X          ,          M       */
-                       0x0503002f 0x0504002d 0x05050033 0x05060032
-                       /* L_SHIFT /          .          SPACE   */
-                       0x0507002a 0x05080035 0x05090034 0x050B0039
-                       /* 1       3          4          2       */
-                       0x06010002 0x06020004 0x06030005 0x06040003
-                       /* 8       7          0          9       */
-                       0x06050009 0x06060008 0x0608000b 0x0609000a
-                       /* L_ALT   DOWN       RIGHT      Q       */
-                       0x060a0038 0x060b006c 0x060c006a 0x07010010
-                       /* E       R          W          I       */
-                       0x07020012 0x07030013 0x07040011 0x07050017
-                       /* U       R_SHIFT    P          O       */
-                       0x07060016 0x07070036 0x07080019 0x07090018
-                       /* UP      LEFT    */
-                       0x070b0067 0x070c0069>;
-       };
-
        fimd@14400000 {
                samsung,vl-freq = <60>;
                samsung,vl-col = <1366>;
@@ -250,3 +195,5 @@
        };
 
 };
+
+#include "cros-ec-keyboard.dtsi"
diff --git a/arch/arm/dts/exynos5420-peach-pit.dts 
b/arch/arm/dts/exynos5420-peach-pit.dts
index fde863d..d1d8735 100644
--- a/arch/arm/dts/exynos5420-peach-pit.dts
+++ b/arch/arm/dts/exynos5420-peach-pit.dts
@@ -28,61 +28,6 @@
                pmic = "/i2c@12ca0000";
        };
 
-       cros-ec-keyb {
-               compatible = "google,cros-ec-keyb";
-               google,key-rows = <8>;
-               google,key-columns = <13>;
-               google,repeat-delay-ms = <240>;
-               google,repeat-rate-ms = <30>;
-               google,ghost-filter;
-               /*
-                * Keymap entries take the form of 0xRRCCKKKK where
-                * RR=Row CC=Column KKKK=Key Code
-                * The values below are for a US keyboard layout and
-                * are taken from the Linux driver. Note that the
-                * 102ND key is not used for US keyboards.
-                */
-               linux,keymap = <
-                       /* CAPSLCK F1         B          F10     */
-                       0x0001003a 0x0002003b 0x00030030 0x00040044
-                       /* N       =          R_ALT      ESC     */
-                       0x00060031 0x0008000d 0x000a0064 0x01010001
-                       /* F4      G          F7         H       */
-                       0x0102003e 0x01030022 0x01040041 0x01060023
-                       /* '       F9         BKSPACE    L_CTRL  */
-                       0x01080028 0x01090043 0x010b000e 0x0200001d
-                       /* TAB     F3         T          F6      */
-                       0x0201000f 0x0202003d 0x02030014 0x02040040
-                       /* ]       Y          102ND      [       */
-                       0x0205001b 0x02060015 0x02070056 0x0208001a
-                       /* F8      GRAVE      F2         5       */
-                       0x02090042 0x03010029 0x0302003c 0x03030006
-                       /* F5      6          -          \       */
-                       0x0304003f 0x03060007 0x0308000c 0x030b002b
-                       /* R_CTRL  A          D          F       */
-                       0x04000061 0x0401001e 0x04020020 0x04030021
-                       /* S       K          J          ;       */
-                       0x0404001f 0x04050025 0x04060024 0x04080027
-                       /* L       ENTER      Z          C       */
-                       0x04090026 0x040b001c 0x0501002c 0x0502002e
-                       /* V       X          ,          M       */
-                       0x0503002f 0x0504002d 0x05050033 0x05060032
-                       /* L_SHIFT /          .          SPACE   */
-                       0x0507002a 0x05080035 0x05090034 0x050B0039
-                       /* 1       3          4          2       */
-                       0x06010002 0x06020004 0x06030005 0x06040003
-                       /* 8       7          0          9       */
-                       0x06050009 0x06060008 0x0608000b 0x0609000a
-                       /* L_ALT   DOWN       RIGHT      Q       */
-                       0x060a0038 0x060b006c 0x060c006a 0x07010010
-                       /* E       R          W          I       */
-                       0x07020012 0x07030013 0x07040011 0x07050017
-                       /* U       R_SHIFT    P          O       */
-                       0x07060016 0x07070036 0x07080019 0x07090018
-                       /* UP      LEFT    */
-                       0x070b0067 0x070c0069>;
-       };
-
        dmc {
                mem-manuf = "samsung";
                mem-type = "ddr3";
@@ -157,7 +102,7 @@
        spi@12d40000 { /* spi2 */
                spi-max-frequency = <4000000>;
                spi-deactivate-delay = <200>;
-               cros-ec@0 {
+               cros_ec: cros-ec@0 {
                        reg = <0>;
                        compatible = "google,cros-ec";
                        spi-half-duplex;
@@ -211,3 +156,5 @@
                samsung,dual-lcd-enabled = <0>;
        };
 };
+
+#include "cros-ec-keyboard.dtsi"
diff --git a/arch/arm/dts/exynos5800-peach-pi.dts 
b/arch/arm/dts/exynos5800-peach-pi.dts
index 8aedf8e..8b86824 100644
--- a/arch/arm/dts/exynos5800-peach-pi.dts
+++ b/arch/arm/dts/exynos5800-peach-pi.dts
@@ -101,7 +101,7 @@
        spi@12d40000 { /* spi2 */
                spi-max-frequency = <4000000>;
                spi-deactivate-delay = <200>;
-               cros-ec@0 {
+               cros_ec: cros-ec@0 {
                        reg = <0>;
                        compatible = "google,cros-ec";
                        spi-half-duplex;
@@ -155,3 +155,5 @@
                samsung,dual-lcd-enabled = <0>;
        };
 };
+
+#include "cros-ec-keyboard.dtsi"
diff --git a/doc/device-tree-bindings/input/cros-ec-keyb.txt 
b/doc/device-tree-bindings/input/cros-ec-keyb.txt
index 3118276..0f6355c 100644
--- a/doc/device-tree-bindings/input/cros-ec-keyb.txt
+++ b/doc/device-tree-bindings/input/cros-ec-keyb.txt
@@ -1,45 +1,38 @@
-CROS_EC Keyboard
+ChromeOS EC Keyboard
 
-The CROS_EC (Matrix Keyboard Protocol) allows communcation with a secondary
-micro used for keyboard, and possible other features.
+Google's ChromeOS EC Keyboard is a simple matrix keyboard implemented on
+a separate EC (Embedded Controller) device. It provides a message for reading
+key scans from the EC. These are then converted into keycodes for processing
+by the kernel.
 
-The CROS_EC keyboard uses this protocol to receive key scans and produce input
-in U-Boot.
+This binding is based on matrix-keymap.txt and extends/modifies it as follows:
 
-Required properties :
-- compatible : "google,cros-ec-keyb"
-- google,key-rows : Number of key rows
-- google,key-columns : Number of key columns
+Required properties:
+- compatible: "google,cros-ec-keyb"
 
-Optional properties, in addition to those specified by the shared
-matrix-keyboard bindings:
+Optional properties:
+- google,needs-ghost-filter: True to enable a ghost filter for the matrix
+keyboard. This is recommended if the EC does not have its own logic or
+hardware for this.
 
-- linux,fn-keymap: a second keymap, same specification as the
-  matrix-keyboard-controller spec but to be used when the KEY_FN modifier
-  key is pressed.
-- google,repeat-delay-ms : delay in milliseconds before repeat starts
-- google,repeat-rate-ms : delay between each subsequent key press
-- google,ghost-filter : enable ghost filtering for this device
 
-Example, taken from daisy:
+Example:
 
 cros-ec-keyb {
        compatible = "google,cros-ec-keyb";
-       google,key-rows = <8>;
-       google,key-columns = <13>;
-       google,ghost-filter;
-       google,repeat-delay-ms = <240>;
-       google,repeat-rate-ms = <30>;
+       keypad,num-rows = <8>;
+       keypad,num-columns = <13>;
+       google,needs-ghost-filter;
        /*
-               * Keymap entries take the form of 0xRRCCKKKK where
-               * RR=Row CC=Column KKKK=Key Code
-               * The values below are for a US keyboard layout and
-               * are taken from the Linux driver. Note that the
-               * 102ND key is not used for US keyboards.
-               */
+        * Keymap entries take the form of 0xRRCCKKKK where
+        * RR=Row CC=Column KKKK=Key Code
+        * The values below are for a US keyboard layout and
+        * are taken from the Linux driver. Note that the
+        * 102ND key is not used for US keyboards.
+        */
        linux,keymap = <
                /* CAPSLCK F1         B          F10     */
-               0x0001003a 0x0002003c 0x00030030 0x00040044
+               0x0001003a 0x0002003b 0x00030030 0x00040044
                /* N       =          R_ALT      ESC     */
                0x00060031 0x0008000d 0x000a0064 0x01010001
                /* F4      G          F7         H       */
diff --git a/drivers/input/cros_ec_keyb.c b/drivers/input/cros_ec_keyb.c
index 47502b1..49ee7b2 100644
--- a/drivers/input/cros_ec_keyb.c
+++ b/drivers/input/cros_ec_keyb.c
@@ -18,6 +18,8 @@ DECLARE_GLOBAL_DATA_PTR;
 
 enum {
        KBC_MAX_KEYS            = 8,    /* Maximum keys held down at once */
+       KBC_REPEAT_RATE_MS      = 30,
+       KBC_REPEAT_DELAY_MS     = 240,
 };
 
 static struct keyb {
@@ -26,8 +28,6 @@ static struct keyb {
        struct key_matrix matrix;       /* The key matrix layer */
        int key_rows;                   /* Number of keyboard rows */
        int key_cols;                   /* Number of keyboard columns */
-       unsigned int repeat_delay_ms;   /* Time before autorepeat starts */
-       unsigned int repeat_rate_ms;    /* Autorepeat rate in ms */
        int ghost_filter;               /* 1 to enable ghost filter, else 0 */
        int inited;                     /* 1 if keyboard is ready */
 } config;
@@ -188,8 +188,8 @@ static int cros_ec_keyb_decode_fdt(const void *blob, int 
node,
         * Get keyboard rows and columns - at present we are limited to
         * 8 columns by the protocol (one byte per row scan)
         */
-       config->key_rows = fdtdec_get_int(blob, node, "google,key-rows", 0);
-       config->key_cols = fdtdec_get_int(blob, node, "google,key-columns", 0);
+       config->key_rows = fdtdec_get_int(blob, node, "keypad,num-rows", 0);
+       config->key_cols = fdtdec_get_int(blob, node, "keypad,num-columns", 0);
        if (!config->key_rows || !config->key_cols ||
                        config->key_rows * config->key_cols / 8
                                > CROS_EC_KEYSCAN_COLS) {
@@ -197,10 +197,6 @@ static int cros_ec_keyb_decode_fdt(const void *blob, int 
node,
                      config->key_rows, config->key_cols);
                return -1;
        }
-       config->repeat_delay_ms = fdtdec_get_int(blob, node,
-                                                "google,repeat-delay-ms", 0);
-       config->repeat_rate_ms = fdtdec_get_int(blob, node,
-                                               "google,repeat-rate-ms", 0);
        config->ghost_filter = fdtdec_get_bool(blob, node,
                                               "google,ghost-filter");
        return 0;
@@ -232,8 +228,8 @@ static int cros_ec_init_keyboard(struct stdio_dev *dev)
        }
        if (cros_ec_keyb_decode_fdt(blob, node, &config))
                return -1;
-       input_set_delays(&config.input, config.repeat_delay_ms,
-                        config.repeat_rate_ms);
+       input_set_delays(&config.input, KBC_REPEAT_DELAY_MS,
+                        KBC_REPEAT_RATE_MS);
        if (key_matrix_init(&config.matrix, config.key_rows,
                        config.key_cols, config.ghost_filter)) {
                debug("%s: cannot init key matrix\n", __func__);
-- 
2.1.3

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to