[PATCH 6/6] input: pxa27x-keypad: add device tree support
Signed-off-by: Chao Xie --- .../devicetree/bindings/input/pxa27x-keypad.txt| 60 ++ drivers/input/keyboard/pxa27x_keypad.c | 198 +++- 2 files changed, 252 insertions(+), 6 deletions(-) create mode 100644 Documentation/devicetree/bindings/input/pxa27x-keypad.txt diff --git a/Documentation/devicetree/bindings/input/pxa27x-keypad.txt b/Documentation/devicetree/bindings/input/pxa27x-keypad.txt new file mode 100644 index 000..f8674f7 --- /dev/null +++ b/Documentation/devicetree/bindings/input/pxa27x-keypad.txt @@ -0,0 +1,60 @@ +* Marvell PXA Keypad controller + +Required Properties +- compatible : should be "marvell,pxa27x-keypad" +- reg : Address and length of the register set for the device +- interrupts : The interrupt for the keypad controller +- marvell,debounce-interval : How long time the key will be + recognized when it is pressed. It is a u32 value, and bit[31:16] + is debounce interval for direct key and bit[15:0] is debounce + interval for matrix key. The value is in binary number of 2ms + +Optional Properties For Matrix Keyes +Please refer to matrix-keymap.txt + +Optional Properties for Direct Keyes +- marvell,direct-key-count : How many direct keyes are used. +- marvell,direct-key-mask : The mask indicates which keyes + are used. If bit[X] of the mask is set, the direct key X + is used. +- marvell,direct-key-low-active : Direct key status register + tells the level of pins that connects to the direct keyes. + When this property is set, it means that when the pin level + is low, the key is pressed(active). +- marvell,direct-key-map : It is a u16 array. Each item indicates + the linux key-code for the direct key. + +Optional Properties For Rotary +- marvell,rotary0 : It is a u32 value. Bit[31:16] is the + linux key-code for rotary up. Bit[15:0] is the linux key-code + for rotary down. It is for rotary 0. +- marvell,rotary1 : Same as marvell,rotary0. It is for rotary 1. +- marvell,rotary-rel-key : When rotary is used for relative axes + in the device, the value indicates the key-code for relative + axes measurement in the device. It is a u32 value. Bit[31:16] + is for rotary 1, and Bit[15:0] is for rotary 0. + +Examples: + keypad: keypad@d4012000 { + keypad,num-rows = <3>; + keypad,num-columns = <5>; + linux,keymap = <0x000e /* KEY_BACKSPACE */ + 0x0001006b /* KEY_END */ + 0x00020061 /* KEY_RIGHTCTRL */ + 0x0003000b /* KEY_0 */ + 0x00040002 /* KEY_1 */ + 0x018b /* KEY_MENU */ + 0x01010066 /* KEY_HOME */ + 0x010200e7 /* KEY_SEND */ + 0x01030009 /* KEY_8 */ + 0x0104000a /* KEY_9 */ + 0x02000160 /* KEY_OK */ + 0x02010003 /* KEY_2 */ + 0x02020004 /* KEY_3 */ + 0x02030005 /* KEY_4 */ + 0x02040006>;/* KEY_5 */ + marvell,rotary0 = <0x006c0067>; /* KEY_UP & KEY_DOWN */ + marvell,direct-key-count = <1>; + marvell,direct-key-map = <0x001c>; + marvell,debounce-interval = <0x001e001e>; + }; diff --git a/drivers/input/keyboard/pxa27x_keypad.c b/drivers/input/keyboard/pxa27x_keypad.c index 975b448..a97ce0e 100644 --- a/drivers/input/keyboard/pxa27x_keypad.c +++ b/drivers/input/keyboard/pxa27x_keypad.c @@ -131,6 +131,181 @@ struct pxa27x_keypad { void (*clear_wakeup_event)(void); }; +static int pxa27x_keypad_matrix_key_parse_dt(struct device *dev, + struct pxa27x_keypad *keypad, struct input_dev *input_dev) +{ + int ret; + u32 rows, cols; + + ret = matrix_keypad_parse_of_params(dev, , ); + if (ret) + return ret; + + if (rows > MAX_MATRIX_KEY_ROWS || cols > MAX_MATRIX_KEY_COLS) { + dev_err(dev, "rows or cols exceeds maximum value\n"); + return -EINVAL; + } + + keypad->matrix_key_rows = rows; + keypad->matrix_key_cols = cols; + + ret = matrix_keypad_build_keymap(NULL, NULL, +keypad->matrix_key_rows, +keypad->matrix_key_cols, +keypad->keycodes, input_dev); + if (ret) + return ret; + + return 0; +} + +static int pxa27x_keypad_direct_key_parse_dt(struct device *dev, + struct pxa27x_keypad *keypad, struct input_dev *input_dev) +{ + struct device_node *np = dev->of_node; + const __be16 *prop; + unsigned short code; + int i, ret; + unsigned int proplen,
[PATCH 6/6] input: pxa27x-keypad: add device tree support
Signed-off-by: Chao Xie chao@marvell.com --- .../devicetree/bindings/input/pxa27x-keypad.txt| 60 ++ drivers/input/keyboard/pxa27x_keypad.c | 198 +++- 2 files changed, 252 insertions(+), 6 deletions(-) create mode 100644 Documentation/devicetree/bindings/input/pxa27x-keypad.txt diff --git a/Documentation/devicetree/bindings/input/pxa27x-keypad.txt b/Documentation/devicetree/bindings/input/pxa27x-keypad.txt new file mode 100644 index 000..f8674f7 --- /dev/null +++ b/Documentation/devicetree/bindings/input/pxa27x-keypad.txt @@ -0,0 +1,60 @@ +* Marvell PXA Keypad controller + +Required Properties +- compatible : should be marvell,pxa27x-keypad +- reg : Address and length of the register set for the device +- interrupts : The interrupt for the keypad controller +- marvell,debounce-interval : How long time the key will be + recognized when it is pressed. It is a u32 value, and bit[31:16] + is debounce interval for direct key and bit[15:0] is debounce + interval for matrix key. The value is in binary number of 2ms + +Optional Properties For Matrix Keyes +Please refer to matrix-keymap.txt + +Optional Properties for Direct Keyes +- marvell,direct-key-count : How many direct keyes are used. +- marvell,direct-key-mask : The mask indicates which keyes + are used. If bit[X] of the mask is set, the direct key X + is used. +- marvell,direct-key-low-active : Direct key status register + tells the level of pins that connects to the direct keyes. + When this property is set, it means that when the pin level + is low, the key is pressed(active). +- marvell,direct-key-map : It is a u16 array. Each item indicates + the linux key-code for the direct key. + +Optional Properties For Rotary +- marvell,rotary0 : It is a u32 value. Bit[31:16] is the + linux key-code for rotary up. Bit[15:0] is the linux key-code + for rotary down. It is for rotary 0. +- marvell,rotary1 : Same as marvell,rotary0. It is for rotary 1. +- marvell,rotary-rel-key : When rotary is used for relative axes + in the device, the value indicates the key-code for relative + axes measurement in the device. It is a u32 value. Bit[31:16] + is for rotary 1, and Bit[15:0] is for rotary 0. + +Examples: + keypad: keypad@d4012000 { + keypad,num-rows = 3; + keypad,num-columns = 5; + linux,keymap = 0x000e /* KEY_BACKSPACE */ + 0x0001006b /* KEY_END */ + 0x00020061 /* KEY_RIGHTCTRL */ + 0x0003000b /* KEY_0 */ + 0x00040002 /* KEY_1 */ + 0x018b /* KEY_MENU */ + 0x01010066 /* KEY_HOME */ + 0x010200e7 /* KEY_SEND */ + 0x01030009 /* KEY_8 */ + 0x0104000a /* KEY_9 */ + 0x02000160 /* KEY_OK */ + 0x02010003 /* KEY_2 */ + 0x02020004 /* KEY_3 */ + 0x02030005 /* KEY_4 */ + 0x02040006;/* KEY_5 */ + marvell,rotary0 = 0x006c0067; /* KEY_UP KEY_DOWN */ + marvell,direct-key-count = 1; + marvell,direct-key-map = 0x001c; + marvell,debounce-interval = 0x001e001e; + }; diff --git a/drivers/input/keyboard/pxa27x_keypad.c b/drivers/input/keyboard/pxa27x_keypad.c index 975b448..a97ce0e 100644 --- a/drivers/input/keyboard/pxa27x_keypad.c +++ b/drivers/input/keyboard/pxa27x_keypad.c @@ -131,6 +131,181 @@ struct pxa27x_keypad { void (*clear_wakeup_event)(void); }; +static int pxa27x_keypad_matrix_key_parse_dt(struct device *dev, + struct pxa27x_keypad *keypad, struct input_dev *input_dev) +{ + int ret; + u32 rows, cols; + + ret = matrix_keypad_parse_of_params(dev, rows, cols); + if (ret) + return ret; + + if (rows MAX_MATRIX_KEY_ROWS || cols MAX_MATRIX_KEY_COLS) { + dev_err(dev, rows or cols exceeds maximum value\n); + return -EINVAL; + } + + keypad-matrix_key_rows = rows; + keypad-matrix_key_cols = cols; + + ret = matrix_keypad_build_keymap(NULL, NULL, +keypad-matrix_key_rows, +keypad-matrix_key_cols, +keypad-keycodes, input_dev); + if (ret) + return ret; + + return 0; +} + +static int pxa27x_keypad_direct_key_parse_dt(struct device *dev, + struct pxa27x_keypad *keypad, struct input_dev *input_dev) +{ + struct device_node *np = dev-of_node; + const __be16 *prop; + unsigned short code; + int i, ret; + unsigned int proplen,