Amol Jadi | ca4f4c9 | 2011-01-13 20:19:34 -0800 | [diff] [blame] | 1 | /* |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 2 | * Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved. |
Amol Jadi | ca4f4c9 | 2011-01-13 20:19:34 -0800 | [diff] [blame] | 3 | * |
| 4 | * Redistribution and use in source and binary forms, with or without |
| 5 | * modification, are permitted provided that the following conditions are met: |
| 6 | * * Redistributions of source code must retain the above copyright |
| 7 | * notice, this list of conditions and the following disclaimer. |
| 8 | * * Redistributions in binary form must reproduce the above copyright |
| 9 | * notice, this list of conditions and the following disclaimer in the |
| 10 | * documentation and/or other materials provided with the distribution. |
| 11 | * * Neither the name of Code Aurora nor |
| 12 | * the names of its contributors may be used to endorse or promote |
| 13 | * products derived from this software without specific prior written |
| 14 | * permission. |
| 15 | * |
| 16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| 17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 18 | * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| 19 | * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
| 20 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| 21 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| 22 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
| 23 | * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| 24 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
| 25 | * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
| 26 | * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 | * |
| 28 | */ |
| 29 | |
Amol Jadi | 6db9fe3 | 2011-04-15 17:19:00 -0700 | [diff] [blame] | 30 | #include <string.h> |
Deepa Dinamani | ad4752a | 2011-12-08 17:51:21 -0800 | [diff] [blame] | 31 | #include <debug.h> |
Amol Jadi | ca4f4c9 | 2011-01-13 20:19:34 -0800 | [diff] [blame] | 32 | #include <dev/keys.h> |
Kinson Chik | ea64624 | 2011-09-01 13:53:16 -0700 | [diff] [blame] | 33 | #include <dev/ssbi.h> |
Amol Jadi | ca4f4c9 | 2011-01-13 20:19:34 -0800 | [diff] [blame] | 34 | #include <dev/gpio_keypad.h> |
Deepa Dinamani | ad4752a | 2011-12-08 17:51:21 -0800 | [diff] [blame] | 35 | #include <dev/pm8921.h> |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 36 | #include <platform/gpio.h> |
| 37 | #include <sys/types.h> |
Deepa Dinamani | ad4752a | 2011-12-08 17:51:21 -0800 | [diff] [blame] | 38 | |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 39 | #define BITS_IN_ELEMENT(x) (sizeof(x) * 8) |
| 40 | #define KEYMAP_INDEX(row, col) (row)* BITS_IN_ELEMENT(unsigned int) + (col) |
Amol Jadi | ca4f4c9 | 2011-01-13 20:19:34 -0800 | [diff] [blame] | 41 | |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 42 | unsigned int msm8960_qwerty_keymap[] = { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 43 | [KEYMAP_INDEX(0, 0)] = KEY_VOLUMEUP, /* Volume key on the device/CDP */ |
| 44 | [KEYMAP_INDEX(0, 1)] = KEY_VOLUMEDOWN, /* Volume key on the device/CDP */ |
Amol Jadi | ca4f4c9 | 2011-01-13 20:19:34 -0800 | [diff] [blame] | 45 | }; |
| 46 | |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 47 | unsigned int msm8960_keys_gpiomap[] = { |
| 48 | [KEYMAP_INDEX(0, 0)] = PM_GPIO(1), /* Volume key on the device/CDP */ |
| 49 | [KEYMAP_INDEX(0, 1)] = PM_GPIO(2), /* Volume key on the device/CDP */ |
| 50 | }; |
| 51 | |
| 52 | struct qwerty_keypad_info msm8960_qwerty_keypad = { |
| 53 | .keymap = msm8960_qwerty_keymap, |
| 54 | .gpiomap = msm8960_keys_gpiomap, |
| 55 | .mapsize = ARRAY_SIZE(msm8960_qwerty_keymap), |
| 56 | .key_gpio_get = &pm8921_gpio_get, |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 57 | .settle_time = 5 /* msec */ , |
| 58 | .poll_time = 20 /* msec */ , |
Amol Jadi | ca4f4c9 | 2011-01-13 20:19:34 -0800 | [diff] [blame] | 59 | }; |
| 60 | |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 61 | unsigned int msm8930_qwerty_keymap[] = { |
| 62 | [KEYMAP_INDEX(0, 0)] = KEY_VOLUMEUP, /* Volume key on the device/CDP */ |
| 63 | [KEYMAP_INDEX(0, 1)] = KEY_VOLUMEDOWN, /* Volume key on the device/CDP */ |
| 64 | }; |
Amol Jadi | 6db9fe3 | 2011-04-15 17:19:00 -0700 | [diff] [blame] | 65 | |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 66 | unsigned int msm8930_keys_gpiomap[] = { |
| 67 | [KEYMAP_INDEX(0, 0)] = PM_GPIO(3), /* Volume key on the device/CDP */ |
| 68 | [KEYMAP_INDEX(0, 1)] = PM_GPIO(8), /* Volume key on the device/CDP */ |
| 69 | }; |
| 70 | |
| 71 | struct qwerty_keypad_info msm8930_qwerty_keypad = { |
| 72 | .keymap = msm8930_qwerty_keymap, |
| 73 | .gpiomap = msm8930_keys_gpiomap, |
| 74 | .mapsize = ARRAY_SIZE(msm8930_qwerty_keymap), |
| 75 | .key_gpio_get = &pm8921_gpio_get, |
| 76 | .settle_time = 5 /* msec */ , |
| 77 | .poll_time = 20 /* msec */ , |
| 78 | }; |
| 79 | |
Amol Jadi | 7607167 | 2012-02-03 12:19:36 -0800 | [diff] [blame^] | 80 | unsigned int apq8064_qwerty_keymap[] = { |
| 81 | [KEYMAP_INDEX(0, 0)] = KEY_VOLUMEUP, /* Volume key on the device/CDP */ |
| 82 | [KEYMAP_INDEX(0, 1)] = KEY_VOLUMEDOWN, /* Volume key on the device/CDP */ |
| 83 | }; |
| 84 | |
| 85 | unsigned int apq8064_keys_gpiomap[] = { |
| 86 | [KEYMAP_INDEX(0, 0)] = PM_GPIO(35), /* Volume key on the device/CDP */ |
| 87 | [KEYMAP_INDEX(0, 1)] = PM_GPIO(38), /* Volume key on the device/CDP */ |
| 88 | }; |
| 89 | |
| 90 | |
| 91 | struct qwerty_keypad_info apq8064_qwerty_keypad = { |
| 92 | .keymap = apq8064_qwerty_keymap, |
| 93 | .gpiomap = apq8064_keys_gpiomap, |
| 94 | .mapsize = ARRAY_SIZE(apq8064_qwerty_keymap), |
| 95 | .key_gpio_get = &pm8921_gpio_get, |
| 96 | .settle_time = 5 /* msec */ , |
| 97 | .poll_time = 20 /* msec */ , |
| 98 | }; |
| 99 | |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 100 | void msm8960_keypad_init(void) |
| 101 | { |
| 102 | msm8960_keypad_gpio_init(); |
| 103 | ssbi_gpio_keypad_init(&msm8960_qwerty_keypad); |
| 104 | } |
| 105 | |
| 106 | void msm8930_keypad_init(void) |
| 107 | { |
| 108 | msm8930_keypad_gpio_init(); |
| 109 | ssbi_gpio_keypad_init(&msm8930_qwerty_keypad); |
Amol Jadi | ca4f4c9 | 2011-01-13 20:19:34 -0800 | [diff] [blame] | 110 | } |
Deepa Dinamani | ad4752a | 2011-12-08 17:51:21 -0800 | [diff] [blame] | 111 | |
Amol Jadi | 7607167 | 2012-02-03 12:19:36 -0800 | [diff] [blame^] | 112 | void apq8064_keypad_init(void) |
| 113 | { |
| 114 | apq8064_keypad_gpio_init(); |
| 115 | ssbi_gpio_keypad_init(&apq8064_qwerty_keypad); |
| 116 | } |
| 117 | |
Deepa Dinamani | ad4752a | 2011-12-08 17:51:21 -0800 | [diff] [blame] | 118 | /* Configure keypad_drv through pwm or DBUS inputs or manually */ |
| 119 | int led_kp_set( int current, |
| 120 | enum kp_backlight_mode mode, |
| 121 | enum kp_backlight_flash_logic flash_logic) |
| 122 | { |
| 123 | int rc = pm8921_config_drv_keypad(current, flash_logic, mode); |
| 124 | |
| 125 | if (rc) |
| 126 | { |
| 127 | dprintf(CRITICAL, "FAIL pm8921_config_drv_keypad(): rc=%d.\n", rc); |
| 128 | } |
| 129 | } |
| 130 | |
| 131 | /* Configure gpio 26 through lpg2 */ |
| 132 | void keypad_led_drv_on_pwm(void) |
| 133 | { |
| 134 | struct pm8921_gpio keypad_pwm = { |
| 135 | .direction = PM_GPIO_DIR_OUT, |
| 136 | .output_buffer = 0, |
| 137 | .output_value = 0, |
| 138 | .pull = PM_GPIO_PULL_NO, |
| 139 | .vin_sel = 2, |
| 140 | .out_strength = PM_GPIO_STRENGTH_HIGH, |
| 141 | .function = PM_GPIO_FUNC_2, |
| 142 | .inv_int_pol = 0, |
| 143 | }; |
| 144 | |
| 145 | int rc = pm8921_gpio_config(PM_GPIO(26), &keypad_pwm); |
| 146 | if (rc) |
| 147 | { |
| 148 | dprintf(CRITICAL, "FAIL pm8921_gpio_config(): rc=%d.\n", rc); |
| 149 | } |
| 150 | } |