Amol Jadi | ca4f4c9 | 2011-01-13 20:19:34 -0800 | [diff] [blame] | 1 | /* |
Duy Truong | f3ac7b3 | 2013-02-13 01:07:28 -0800 | [diff] [blame] | 2 | * Copyright (c) 2011-2012, The Linux Foundation. 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. |
Duy Truong | f3ac7b3 | 2013-02-13 01:07:28 -0800 | [diff] [blame] | 11 | * * Neither the name of The Linux Foundation nor |
Amol Jadi | ca4f4c9 | 2011-01-13 20:19:34 -0800 | [diff] [blame] | 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 | b8b1643 | 2012-08-24 15:48:45 -0700 | [diff] [blame] | 38 | #include <board.h> |
| 39 | #include <smem.h> |
Deepa Dinamani | ad4752a | 2011-12-08 17:51:21 -0800 | [diff] [blame] | 40 | |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 41 | #define BITS_IN_ELEMENT(x) (sizeof(x) * 8) |
| 42 | #define KEYMAP_INDEX(row, col) (row)* BITS_IN_ELEMENT(unsigned int) + (col) |
Amol Jadi | ca4f4c9 | 2011-01-13 20:19:34 -0800 | [diff] [blame] | 43 | |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 44 | unsigned int msm8960_qwerty_keymap[] = { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 45 | [KEYMAP_INDEX(0, 0)] = KEY_VOLUMEUP, /* Volume key on the device/CDP */ |
| 46 | [KEYMAP_INDEX(0, 1)] = KEY_VOLUMEDOWN, /* Volume key on the device/CDP */ |
Amol Jadi | ca4f4c9 | 2011-01-13 20:19:34 -0800 | [diff] [blame] | 47 | }; |
| 48 | |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 49 | unsigned int msm8960_keys_gpiomap[] = { |
| 50 | [KEYMAP_INDEX(0, 0)] = PM_GPIO(1), /* Volume key on the device/CDP */ |
| 51 | [KEYMAP_INDEX(0, 1)] = PM_GPIO(2), /* Volume key on the device/CDP */ |
| 52 | }; |
| 53 | |
| 54 | struct qwerty_keypad_info msm8960_qwerty_keypad = { |
| 55 | .keymap = msm8960_qwerty_keymap, |
| 56 | .gpiomap = msm8960_keys_gpiomap, |
| 57 | .mapsize = ARRAY_SIZE(msm8960_qwerty_keymap), |
| 58 | .key_gpio_get = &pm8921_gpio_get, |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 59 | .settle_time = 5 /* msec */ , |
| 60 | .poll_time = 20 /* msec */ , |
Amol Jadi | ca4f4c9 | 2011-01-13 20:19:34 -0800 | [diff] [blame] | 61 | }; |
| 62 | |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 63 | unsigned int msm8930_qwerty_keymap[] = { |
| 64 | [KEYMAP_INDEX(0, 0)] = KEY_VOLUMEUP, /* Volume key on the device/CDP */ |
| 65 | [KEYMAP_INDEX(0, 1)] = KEY_VOLUMEDOWN, /* Volume key on the device/CDP */ |
| 66 | }; |
Amol Jadi | 6db9fe3 | 2011-04-15 17:19:00 -0700 | [diff] [blame] | 67 | |
Neeti Desai | 7c30336 | 2012-09-18 11:50:22 -0700 | [diff] [blame] | 68 | unsigned int msm8930_keys_pm8038_gpiomap[] = { |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 69 | [KEYMAP_INDEX(0, 0)] = PM_GPIO(3), /* Volume key on the device/CDP */ |
| 70 | [KEYMAP_INDEX(0, 1)] = PM_GPIO(8), /* Volume key on the device/CDP */ |
| 71 | }; |
| 72 | |
Neeti Desai | 7c30336 | 2012-09-18 11:50:22 -0700 | [diff] [blame] | 73 | unsigned int msm8930_keys_pm8917_gpiomap[] = { |
| 74 | [KEYMAP_INDEX(0, 0)] = PM_GPIO(27), /* Volume key on the device/CDP */ |
| 75 | [KEYMAP_INDEX(0, 1)] = PM_GPIO(28), /* Volume key on the device/CDP */ |
| 76 | }; |
| 77 | |
| 78 | struct qwerty_keypad_info msm8930_pm8038_qwerty_keypad = { |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 79 | .keymap = msm8930_qwerty_keymap, |
Neeti Desai | 7c30336 | 2012-09-18 11:50:22 -0700 | [diff] [blame] | 80 | .gpiomap = msm8930_keys_pm8038_gpiomap, |
| 81 | .mapsize = ARRAY_SIZE(msm8930_qwerty_keymap), |
| 82 | .key_gpio_get = &pm8921_gpio_get, |
| 83 | .settle_time = 5 /* msec */ , |
| 84 | .poll_time = 20 /* msec */ , |
| 85 | }; |
| 86 | |
| 87 | struct qwerty_keypad_info msm8930_pm8917_qwerty_keypad = { |
| 88 | .keymap = msm8930_qwerty_keymap, |
| 89 | .gpiomap = msm8930_keys_pm8917_gpiomap, |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 90 | .mapsize = ARRAY_SIZE(msm8930_qwerty_keymap), |
| 91 | .key_gpio_get = &pm8921_gpio_get, |
| 92 | .settle_time = 5 /* msec */ , |
| 93 | .poll_time = 20 /* msec */ , |
| 94 | }; |
| 95 | |
Amol Jadi | 7607167 | 2012-02-03 12:19:36 -0800 | [diff] [blame] | 96 | unsigned int apq8064_qwerty_keymap[] = { |
| 97 | [KEYMAP_INDEX(0, 0)] = KEY_VOLUMEUP, /* Volume key on the device/CDP */ |
| 98 | [KEYMAP_INDEX(0, 1)] = KEY_VOLUMEDOWN, /* Volume key on the device/CDP */ |
| 99 | }; |
| 100 | |
Deepa Dinamani | b8b1643 | 2012-08-24 15:48:45 -0700 | [diff] [blame] | 101 | unsigned int apq8064_pm8921_keys_gpiomap[] = { |
Amol Jadi | 7607167 | 2012-02-03 12:19:36 -0800 | [diff] [blame] | 102 | [KEYMAP_INDEX(0, 0)] = PM_GPIO(35), /* Volume key on the device/CDP */ |
| 103 | [KEYMAP_INDEX(0, 1)] = PM_GPIO(38), /* Volume key on the device/CDP */ |
| 104 | }; |
| 105 | |
Deepa Dinamani | b8b1643 | 2012-08-24 15:48:45 -0700 | [diff] [blame] | 106 | unsigned int apq8064_pm8917_keys_gpiomap[] = { |
| 107 | [KEYMAP_INDEX(0, 0)] = PM_GPIO(35), /* Volume key on the device/CDP */ |
| 108 | [KEYMAP_INDEX(0, 1)] = PM_GPIO(30), /* Volume key on the device/CDP */ |
| 109 | }; |
Amol Jadi | 7607167 | 2012-02-03 12:19:36 -0800 | [diff] [blame] | 110 | |
Deepa Dinamani | b8b1643 | 2012-08-24 15:48:45 -0700 | [diff] [blame] | 111 | struct qwerty_keypad_info apq8064_pm8921_qwerty_keypad = { |
Amol Jadi | 7607167 | 2012-02-03 12:19:36 -0800 | [diff] [blame] | 112 | .keymap = apq8064_qwerty_keymap, |
Deepa Dinamani | b8b1643 | 2012-08-24 15:48:45 -0700 | [diff] [blame] | 113 | .gpiomap = apq8064_pm8921_keys_gpiomap, |
| 114 | .mapsize = ARRAY_SIZE(apq8064_qwerty_keymap), |
| 115 | .key_gpio_get = &pm8921_gpio_get, |
| 116 | .settle_time = 5 /* msec */ , |
| 117 | .poll_time = 20 /* msec */ , |
| 118 | }; |
| 119 | |
| 120 | struct qwerty_keypad_info apq8064_pm8917_qwerty_keypad = { |
| 121 | .keymap = apq8064_qwerty_keymap, |
| 122 | .gpiomap = apq8064_pm8917_keys_gpiomap, |
Amol Jadi | 7607167 | 2012-02-03 12:19:36 -0800 | [diff] [blame] | 123 | .mapsize = ARRAY_SIZE(apq8064_qwerty_keymap), |
| 124 | .key_gpio_get = &pm8921_gpio_get, |
| 125 | .settle_time = 5 /* msec */ , |
| 126 | .poll_time = 20 /* msec */ , |
| 127 | }; |
| 128 | |
Shashank Mittal | b3be37f | 2012-01-16 22:59:49 -0800 | [diff] [blame] | 129 | void msm8960_keypad_init(void) |
| 130 | { |
| 131 | msm8960_keypad_gpio_init(); |
| 132 | ssbi_gpio_keypad_init(&msm8960_qwerty_keypad); |
| 133 | } |
| 134 | |
| 135 | void msm8930_keypad_init(void) |
| 136 | { |
| 137 | msm8930_keypad_gpio_init(); |
Neeti Desai | 7c30336 | 2012-09-18 11:50:22 -0700 | [diff] [blame] | 138 | |
Channagoud Kadabi | 80e776b | 2013-02-15 19:52:12 -0800 | [diff] [blame] | 139 | if (platform_pmic_type(PMIC_IS_PM8917)) |
Neeti Desai | 7c30336 | 2012-09-18 11:50:22 -0700 | [diff] [blame] | 140 | { |
| 141 | ssbi_gpio_keypad_init(&msm8930_pm8917_qwerty_keypad); |
| 142 | } |
| 143 | else |
| 144 | { |
| 145 | ssbi_gpio_keypad_init(&msm8930_pm8038_qwerty_keypad); |
| 146 | } |
Amol Jadi | ca4f4c9 | 2011-01-13 20:19:34 -0800 | [diff] [blame] | 147 | } |
Deepa Dinamani | ad4752a | 2011-12-08 17:51:21 -0800 | [diff] [blame] | 148 | |
Amol Jadi | 7607167 | 2012-02-03 12:19:36 -0800 | [diff] [blame] | 149 | void apq8064_keypad_init(void) |
| 150 | { |
| 151 | apq8064_keypad_gpio_init(); |
Deepa Dinamani | b8b1643 | 2012-08-24 15:48:45 -0700 | [diff] [blame] | 152 | |
Channagoud Kadabi | 80e776b | 2013-02-15 19:52:12 -0800 | [diff] [blame] | 153 | if (platform_pmic_type(PMIC_IS_PM8917)) |
Deepa Dinamani | b8b1643 | 2012-08-24 15:48:45 -0700 | [diff] [blame] | 154 | ssbi_gpio_keypad_init(&apq8064_pm8917_qwerty_keypad); |
| 155 | else |
| 156 | ssbi_gpio_keypad_init(&apq8064_pm8921_qwerty_keypad); |
Amol Jadi | 7607167 | 2012-02-03 12:19:36 -0800 | [diff] [blame] | 157 | } |
| 158 | |
Deepa Dinamani | ad4752a | 2011-12-08 17:51:21 -0800 | [diff] [blame] | 159 | /* Configure keypad_drv through pwm or DBUS inputs or manually */ |
| 160 | int led_kp_set( int current, |
| 161 | enum kp_backlight_mode mode, |
| 162 | enum kp_backlight_flash_logic flash_logic) |
| 163 | { |
| 164 | int rc = pm8921_config_drv_keypad(current, flash_logic, mode); |
| 165 | |
| 166 | if (rc) |
| 167 | { |
| 168 | dprintf(CRITICAL, "FAIL pm8921_config_drv_keypad(): rc=%d.\n", rc); |
| 169 | } |
| 170 | } |
| 171 | |
| 172 | /* Configure gpio 26 through lpg2 */ |
| 173 | void keypad_led_drv_on_pwm(void) |
| 174 | { |
| 175 | struct pm8921_gpio keypad_pwm = { |
| 176 | .direction = PM_GPIO_DIR_OUT, |
| 177 | .output_buffer = 0, |
| 178 | .output_value = 0, |
| 179 | .pull = PM_GPIO_PULL_NO, |
| 180 | .vin_sel = 2, |
| 181 | .out_strength = PM_GPIO_STRENGTH_HIGH, |
| 182 | .function = PM_GPIO_FUNC_2, |
| 183 | .inv_int_pol = 0, |
| 184 | }; |
| 185 | |
| 186 | int rc = pm8921_gpio_config(PM_GPIO(26), &keypad_pwm); |
| 187 | if (rc) |
| 188 | { |
| 189 | dprintf(CRITICAL, "FAIL pm8921_gpio_config(): rc=%d.\n", rc); |
| 190 | } |
| 191 | } |