2 * Copyright (C) ST-Ericsson SA 2010
4 * License terms: GNU General Public License (GPL), version 2
7 #include <linux/kernel.h>
8 #include <linux/init.h>
9 #include <linux/mfd/stmpe.h>
10 #include <linux/input/bu21013.h>
11 #include <linux/gpio.h>
12 #include <linux/interrupt.h>
13 #include <linux/i2c.h>
14 #include <linux/input/matrix_keypad.h>
15 #include <asm/mach-types.h>
17 #include "board-mop500.h"
19 /* STMPE/SKE keypad use this key layout */
20 static const unsigned int mop500_keymap
[] = {
23 KEY(3, 5, KEY_VOLUMEDOWN
),
37 KEY(4, 2, KEY_VOLUMEUP
),
43 static const struct matrix_keymap_data mop500_keymap_data
= {
44 .keymap
= mop500_keymap
,
45 .keymap_size
= ARRAY_SIZE(mop500_keymap
),
50 static struct stmpe_keypad_platform_data stmpe1601_keypad_data
= {
53 .no_autorepeat
= true,
54 .keymap_data
= &mop500_keymap_data
,
57 static struct stmpe_platform_data stmpe1601_data
= {
59 .blocks
= STMPE_BLOCK_KEYPAD
,
60 .irq_trigger
= IRQF_TRIGGER_FALLING
,
61 .irq_base
= MOP500_STMPE1601_IRQ(0),
62 .keypad
= &stmpe1601_keypad_data
,
64 .autosleep_timeout
= 1024,
67 static struct i2c_board_info __initdata mop500_i2c0_devices_stuib
[] = {
69 I2C_BOARD_INFO("stmpe1601", 0x40),
70 .irq
= NOMADIK_GPIO_TO_IRQ(218),
71 .platform_data
= &stmpe1601_data
,
72 .flags
= I2C_CLIENT_WAKE
,
77 * BU21013 ROHM touchscreen interface on the STUIBs
80 /* tracks number of bu21013 devices being enabled */
81 static int bu21013_devices
;
83 #define TOUCH_GPIO_PIN 84
85 #define TOUCH_XMAX 384
86 #define TOUCH_YMAX 704
88 #define PRCMU_CLOCK_OCR 0x1CC
89 #define TSC_EXT_CLOCK_9_6MHZ 0x840000
92 * bu21013_gpio_board_init : configures the touch panel.
93 * @reset_pin: reset pin number
94 * This function can be used to configures
95 * the voltage and reset the touch panel controller.
97 static int bu21013_gpio_board_init(int reset_pin
)
102 if (bu21013_devices
== 1) {
103 retval
= gpio_request(reset_pin
, "touchp_reset");
105 printk(KERN_ERR
"Unable to request gpio reset_pin");
108 retval
= gpio_direction_output(reset_pin
, 1);
110 printk(KERN_ERR
"%s: gpio direction failed\n",
120 * bu21013_gpio_board_exit : deconfigures the touch panel controller
121 * @reset_pin: reset pin number
122 * This function can be used to deconfigures the chip selection
123 * for touch panel controller.
125 static int bu21013_gpio_board_exit(int reset_pin
)
129 if (bu21013_devices
== 1) {
130 retval
= gpio_direction_output(reset_pin
, 0);
132 printk(KERN_ERR
"%s: gpio direction failed\n",
136 gpio_set_value(reset_pin
, 0);
144 * bu21013_read_pin_val : get the interrupt pin value
145 * This function can be used to get the interrupt pin value for touch panel
148 static int bu21013_read_pin_val(void)
150 return gpio_get_value(TOUCH_GPIO_PIN
);
153 static struct bu21013_platform_device tsc_plat_device
= {
154 .cs_en
= bu21013_gpio_board_init
,
155 .cs_dis
= bu21013_gpio_board_exit
,
156 .irq_read_val
= bu21013_read_pin_val
,
157 .irq
= NOMADIK_GPIO_TO_IRQ(TOUCH_GPIO_PIN
),
158 .touch_x_max
= TOUCH_XMAX
,
159 .touch_y_max
= TOUCH_YMAX
,
165 static struct bu21013_platform_device tsc_plat2_device
= {
166 .cs_en
= bu21013_gpio_board_init
,
167 .cs_dis
= bu21013_gpio_board_exit
,
168 .irq_read_val
= bu21013_read_pin_val
,
169 .irq
= NOMADIK_GPIO_TO_IRQ(TOUCH_GPIO_PIN
),
170 .touch_x_max
= TOUCH_XMAX
,
171 .touch_y_max
= TOUCH_YMAX
,
177 static struct i2c_board_info __initdata u8500_i2c3_devices_stuib
[] = {
179 I2C_BOARD_INFO("bu21013_tp", 0x5C),
180 .platform_data
= &tsc_plat_device
,
183 I2C_BOARD_INFO("bu21013_tp", 0x5D),
184 .platform_data
= &tsc_plat2_device
,
189 void __init
mop500_stuib_init(void)
191 if (machine_is_hrefv60()) {
192 tsc_plat_device
.cs_pin
= HREFV60_TOUCH_RST_GPIO
;
193 tsc_plat2_device
.cs_pin
= HREFV60_TOUCH_RST_GPIO
;
195 tsc_plat_device
.cs_pin
= GPIO_BU21013_CS
;
196 tsc_plat2_device
.cs_pin
= GPIO_BU21013_CS
;
200 mop500_uib_i2c_add(0, mop500_i2c0_devices_stuib
,
201 ARRAY_SIZE(mop500_i2c0_devices_stuib
));
203 mop500_uib_i2c_add(3, u8500_i2c3_devices_stuib
,
204 ARRAY_SIZE(u8500_i2c3_devices_stuib
));