blob: 1639f19a808e12c69a2ef3c191212720167899d6 [file] [log] [blame]
Amol Jadica4f4c92011-01-13 20:19:34 -08001/*
Duy Truongf3ac7b32013-02-13 01:07:28 -08002 * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
Amol Jadica4f4c92011-01-13 20:19:34 -08003 *
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 Truongf3ac7b32013-02-13 01:07:28 -080011 * * Neither the name of The Linux Foundation nor
Amol Jadica4f4c92011-01-13 20:19:34 -080012 * 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 Jadi6db9fe32011-04-15 17:19:00 -070030#include <string.h>
Deepa Dinamaniad4752a2011-12-08 17:51:21 -080031#include <debug.h>
Amol Jadica4f4c92011-01-13 20:19:34 -080032#include <dev/keys.h>
Kinson Chikea646242011-09-01 13:53:16 -070033#include <dev/ssbi.h>
Amol Jadica4f4c92011-01-13 20:19:34 -080034#include <dev/gpio_keypad.h>
Deepa Dinamaniad4752a2011-12-08 17:51:21 -080035#include <dev/pm8921.h>
Shashank Mittalb3be37f2012-01-16 22:59:49 -080036#include <platform/gpio.h>
37#include <sys/types.h>
Deepa Dinamanib8b16432012-08-24 15:48:45 -070038#include <board.h>
39#include <smem.h>
Deepa Dinamaniad4752a2011-12-08 17:51:21 -080040
Shashank Mittalb3be37f2012-01-16 22:59:49 -080041#define BITS_IN_ELEMENT(x) (sizeof(x) * 8)
42#define KEYMAP_INDEX(row, col) (row)* BITS_IN_ELEMENT(unsigned int) + (col)
Amol Jadica4f4c92011-01-13 20:19:34 -080043
Shashank Mittalb3be37f2012-01-16 22:59:49 -080044unsigned int msm8960_qwerty_keymap[] = {
Ajay Dudanib01e5062011-12-03 23:23:42 -080045 [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 Jadica4f4c92011-01-13 20:19:34 -080047};
48
Shashank Mittalb3be37f2012-01-16 22:59:49 -080049unsigned 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
54struct 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 Dudanib01e5062011-12-03 23:23:42 -080059 .settle_time = 5 /* msec */ ,
60 .poll_time = 20 /* msec */ ,
Amol Jadica4f4c92011-01-13 20:19:34 -080061};
62
Shashank Mittalb3be37f2012-01-16 22:59:49 -080063unsigned 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 Jadi6db9fe32011-04-15 17:19:00 -070067
Neeti Desai7c303362012-09-18 11:50:22 -070068unsigned int msm8930_keys_pm8038_gpiomap[] = {
Shashank Mittalb3be37f2012-01-16 22:59:49 -080069 [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 Desai7c303362012-09-18 11:50:22 -070073unsigned 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
78struct qwerty_keypad_info msm8930_pm8038_qwerty_keypad = {
Shashank Mittalb3be37f2012-01-16 22:59:49 -080079 .keymap = msm8930_qwerty_keymap,
Neeti Desai7c303362012-09-18 11:50:22 -070080 .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
87struct qwerty_keypad_info msm8930_pm8917_qwerty_keypad = {
88 .keymap = msm8930_qwerty_keymap,
89 .gpiomap = msm8930_keys_pm8917_gpiomap,
Shashank Mittalb3be37f2012-01-16 22:59:49 -080090 .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 Jadi76071672012-02-03 12:19:36 -080096unsigned 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 Dinamanib8b16432012-08-24 15:48:45 -0700101unsigned int apq8064_pm8921_keys_gpiomap[] = {
Amol Jadi76071672012-02-03 12:19:36 -0800102 [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 Dinamanib8b16432012-08-24 15:48:45 -0700106unsigned 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 Jadi76071672012-02-03 12:19:36 -0800110
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700111struct qwerty_keypad_info apq8064_pm8921_qwerty_keypad = {
Amol Jadi76071672012-02-03 12:19:36 -0800112 .keymap = apq8064_qwerty_keymap,
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700113 .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
120struct qwerty_keypad_info apq8064_pm8917_qwerty_keypad = {
121 .keymap = apq8064_qwerty_keymap,
122 .gpiomap = apq8064_pm8917_keys_gpiomap,
Amol Jadi76071672012-02-03 12:19:36 -0800123 .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 Mittalb3be37f2012-01-16 22:59:49 -0800129void msm8960_keypad_init(void)
130{
131 msm8960_keypad_gpio_init();
132 ssbi_gpio_keypad_init(&msm8960_qwerty_keypad);
133}
134
135void msm8930_keypad_init(void)
136{
137 msm8930_keypad_gpio_init();
Neeti Desai7c303362012-09-18 11:50:22 -0700138
Channagoud Kadabi80e776b2013-02-15 19:52:12 -0800139 if (platform_pmic_type(PMIC_IS_PM8917))
Neeti Desai7c303362012-09-18 11:50:22 -0700140 {
141 ssbi_gpio_keypad_init(&msm8930_pm8917_qwerty_keypad);
142 }
143 else
144 {
145 ssbi_gpio_keypad_init(&msm8930_pm8038_qwerty_keypad);
146 }
Amol Jadica4f4c92011-01-13 20:19:34 -0800147}
Deepa Dinamaniad4752a2011-12-08 17:51:21 -0800148
Amol Jadi76071672012-02-03 12:19:36 -0800149void apq8064_keypad_init(void)
150{
151 apq8064_keypad_gpio_init();
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700152
Channagoud Kadabi80e776b2013-02-15 19:52:12 -0800153 if (platform_pmic_type(PMIC_IS_PM8917))
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700154 ssbi_gpio_keypad_init(&apq8064_pm8917_qwerty_keypad);
155 else
156 ssbi_gpio_keypad_init(&apq8064_pm8921_qwerty_keypad);
Amol Jadi76071672012-02-03 12:19:36 -0800157}
158
Deepa Dinamaniad4752a2011-12-08 17:51:21 -0800159/* Configure keypad_drv through pwm or DBUS inputs or manually */
160int 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 */
173void 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}