Linux Audio

Check our new training course

Linux kernel drivers training

May 6-19, 2025
Register
Loading...
Note: File does not exist in v5.4.
  1/*
  2 * Copyright (C) ST-Ericsson SA 2010
  3 *
  4 * License terms: GNU General Public License (GPL), version 2
  5 */
  6
  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>
 16
 17#include "board-mop500.h"
 18
 19/* STMPE/SKE keypad use this key layout */
 20static const unsigned int mop500_keymap[] = {
 21	KEY(2, 5, KEY_END),
 22	KEY(4, 1, KEY_POWER),
 23	KEY(3, 5, KEY_VOLUMEDOWN),
 24	KEY(1, 3, KEY_3),
 25	KEY(5, 2, KEY_RIGHT),
 26	KEY(5, 0, KEY_9),
 27
 28	KEY(0, 5, KEY_MENU),
 29	KEY(7, 6, KEY_ENTER),
 30	KEY(4, 5, KEY_0),
 31	KEY(6, 7, KEY_2),
 32	KEY(3, 4, KEY_UP),
 33	KEY(3, 3, KEY_DOWN),
 34
 35	KEY(6, 4, KEY_SEND),
 36	KEY(6, 2, KEY_BACK),
 37	KEY(4, 2, KEY_VOLUMEUP),
 38	KEY(5, 5, KEY_1),
 39	KEY(4, 3, KEY_LEFT),
 40	KEY(3, 2, KEY_7),
 41};
 42
 43static const struct matrix_keymap_data mop500_keymap_data = {
 44	.keymap		= mop500_keymap,
 45	.keymap_size    = ARRAY_SIZE(mop500_keymap),
 46};
 47/*
 48 * STMPE1601
 49 */
 50static struct stmpe_keypad_platform_data stmpe1601_keypad_data = {
 51	.debounce_ms    = 64,
 52	.scan_count     = 8,
 53	.no_autorepeat  = true,
 54	.keymap_data    = &mop500_keymap_data,
 55};
 56
 57static struct stmpe_platform_data stmpe1601_data = {
 58	.id		= 1,
 59	.blocks		= STMPE_BLOCK_KEYPAD,
 60	.irq_trigger    = IRQF_TRIGGER_FALLING,
 61	.irq_base       = MOP500_STMPE1601_IRQ(0),
 62	.keypad		= &stmpe1601_keypad_data,
 63	.autosleep      = true,
 64	.autosleep_timeout = 1024,
 65};
 66
 67static struct i2c_board_info __initdata mop500_i2c0_devices_stuib[] = {
 68	{
 69		I2C_BOARD_INFO("stmpe1601", 0x40),
 70		.irq = NOMADIK_GPIO_TO_IRQ(218),
 71		.platform_data = &stmpe1601_data,
 72		.flags = I2C_CLIENT_WAKE,
 73	},
 74};
 75
 76/*
 77 * BU21013 ROHM touchscreen interface on the STUIBs
 78 */
 79
 80/* tracks number of bu21013 devices being enabled */
 81static int bu21013_devices;
 82
 83#define TOUCH_GPIO_PIN  84
 84
 85#define TOUCH_XMAX	384
 86#define TOUCH_YMAX	704
 87
 88#define PRCMU_CLOCK_OCR		0x1CC
 89#define TSC_EXT_CLOCK_9_6MHZ	0x840000
 90
 91/**
 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.
 96 */
 97static int bu21013_gpio_board_init(int reset_pin)
 98{
 99	int retval = 0;
100
101	bu21013_devices++;
102	if (bu21013_devices == 1) {
103		retval = gpio_request(reset_pin, "touchp_reset");
104		if (retval) {
105			printk(KERN_ERR "Unable to request gpio reset_pin");
106			return retval;
107		}
108		retval = gpio_direction_output(reset_pin, 1);
109		if (retval < 0) {
110			printk(KERN_ERR "%s: gpio direction failed\n",
111					__func__);
112			return retval;
113		}
114	}
115
116	return retval;
117}
118
119/**
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.
124 */
125static int bu21013_gpio_board_exit(int reset_pin)
126{
127	int retval = 0;
128
129	if (bu21013_devices == 1) {
130		retval = gpio_direction_output(reset_pin, 0);
131		if (retval < 0) {
132			printk(KERN_ERR "%s: gpio direction failed\n",
133					__func__);
134			return retval;
135		}
136		gpio_set_value(reset_pin, 0);
137	}
138	bu21013_devices--;
139
140	return retval;
141}
142
143/**
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
146 * controller.
147 */
148static int bu21013_read_pin_val(void)
149{
150	return gpio_get_value(TOUCH_GPIO_PIN);
151}
152
153static 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,
160	.ext_clk = false,
161	.x_flip = false,
162	.y_flip = true,
163};
164
165static 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,
172	.ext_clk = false,
173	.x_flip = false,
174	.y_flip = true,
175};
176
177static struct i2c_board_info __initdata u8500_i2c3_devices_stuib[] = {
178	{
179		I2C_BOARD_INFO("bu21013_tp", 0x5C),
180		.platform_data = &tsc_plat_device,
181	},
182	{
183		I2C_BOARD_INFO("bu21013_tp", 0x5D),
184		.platform_data = &tsc_plat2_device,
185	},
186
187};
188
189void __init mop500_stuib_init(void)
190{
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;
194	} else {
195		tsc_plat_device.cs_pin = GPIO_BU21013_CS;
196		tsc_plat2_device.cs_pin = GPIO_BU21013_CS;
197
198	}
199
200	mop500_uib_i2c_add(0, mop500_i2c0_devices_stuib,
201			ARRAY_SIZE(mop500_i2c0_devices_stuib));
202
203	mop500_uib_i2c_add(3, u8500_i2c3_devices_stuib,
204			ARRAY_SIZE(u8500_i2c3_devices_stuib));
205}