aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/mach-ux500/include/mach/stmpe1601.h
blob: c676f00b3432e871f1b97ddba149df71b8a355e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
/*
 * Overview:
 *  	 stmpe1601 gpio port expander register definitions
 *
 * Copyright (C) 2009 ST Ericsson.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License
 */

#ifndef __STMPE1601_H_
#define __STMPE1601_H_

#include <linux/gpio.h>

/*
 * STMPE interrupt numbers
 */
#if defined(CONFIG_MACH_U8500_MOP)
#define STMPE16010_INTR  		218 /*GPIO_PIN_218- TODO*/
#endif

/*Register definition*/

/*System registers Index*/
#define CHIP_ID_Index    		0x80
#define VERSION_ID_Index 		0x81
#define SYSCON_Index     		0x02
#define SYSCON_Index_2     		0x03

/*Interrupt registers Index*/
#define ICR_Msb_Index     0x10  /*Interrupt Control register*/
#define ICR_Lsb_Index     0x11
#define IER_Msb_Index     0x12  /*Interrupt Enable Mask register*/
#define IER_Lsb_Index     0x13
#define ISR_Msb_Index     0x14  /*Interrupt Status register*/
#define ISR_Lsb_Index     0x15
#define IEGPIOR_Msb_Index 0x16  /*Interrupt Enable GPIO Mask register*/
#define IEGPIOR_Lsb_Index 0x17
#define ISGPIOR_Msb_Index 0x18  /*Interrupt Status GPIO registers*/
#define ISGPIOR_Lsb_Index 0x19


/*Keypad Controller Registers*/
#define KPC_COL_Index        0x60  /*Keypad column register I2C index*/
#define KPC_ROW_Msb_Index    0x61
#define KPC_ROW_Lsb_Index    0x62
#define KPC_CTRL_Msb_Index   0x63
#define KPC_CTRL_Lsb_Index   0x64
#define KPC_COMBI_KEY_0      0x65
#define KPC_COMBI_KEY_1      0x66
#define KPC_COMBI_KEY_2      0x67
#define KPC_DATA_BYTE0_Index 0x68
#define KPC_DATA_BYTE1_Index 0x69
#define KPC_DATA_BYTE2_Index 0x6a
#define KPC_DATA_BYTE3_Index 0x6b
#define KPC_DATA_BYTE4_Index 0x6c

/*Gpio's defines*/
/*GPIO Set Pin State register Index*/
#define STMPE1601_GPIO_REG_OFFSET(offset) (0x80 + (offset))
#define GPSR_Msb_Index      STMPE1601_GPIO_REG_OFFSET(0x02) /* 0x82 */
#define GPSR_Lsb_Index      STMPE1601_GPIO_REG_OFFSET(0x03) /* 0x85 */
/*GPIO Clear Pin State register Index*/
#define GPCR_Msb_Index      STMPE1601_GPIO_REG_OFFSET(0x04) /* 0x86 */
#define GPCR_Lsb_Index      STMPE1601_GPIO_REG_OFFSET(0x05) /* 0x87 */
/*GPIO Monitor Pin register Index*/
#define GPMR_Msb_Index      STMPE1601_GPIO_REG_OFFSET(0x06) /* 0x88 */
#define GPMR_Lsb_Index      STMPE1601_GPIO_REG_OFFSET(0x07) /* 0x89 */
/*GPIO Set Pin Direction register*/
#define GPDR_Msb_Index      STMPE1601_GPIO_REG_OFFSET(0x08) /* 0x8A */
#define GPDR_Lsb_Index      STMPE1601_GPIO_REG_OFFSET(0x09) /* 0x8B */
/*GPIO Edge Detect Status register*/
#define GPEDR_Msb_Index      STMPE1601_GPIO_REG_OFFSET(0x0A) /* 0x8C */
#define GPEDR_Lsb_Index      STMPE1601_GPIO_REG_OFFSET(0x0B) /* 0x8D */
/*GPIO Rising Edge register*/
#define GPRER_Msb_Index      STMPE1601_GPIO_REG_OFFSET(0x0C) /* 0x8E */
#define GPRER_Lsb_Index      STMPE1601_GPIO_REG_OFFSET(0x0D) /* 0x8F */
/*GPIO Falling Edge register*/
#define GPFER_Msb_Index      STMPE1601_GPIO_REG_OFFSET(0x0E) /* 0x90 */
#define GPFER_Lsb_Index      STMPE1601_GPIO_REG_OFFSET(0x0F) /* 0x91 */
/*GPIO Pull Up register*/
#define GPPUR_Msb_Index     STMPE1601_GPIO_REG_OFFSET(0x10) /* 0x92 */
#define GPPUR_Lsb_Index     STMPE1601_GPIO_REG_OFFSET(0x11) /* 0x93 */

/*GPIO Alternate Function register*/
#define GPAFR_U_Msb_Index   STMPE1601_GPIO_REG_OFFSET(0x12) /* 0x94 */
#define GPAFR_U_Lsb_Index   STMPE1601_GPIO_REG_OFFSET(0x13) /* 0x95 */

#define GPAFR_L_Msb_Index   STMPE1601_GPIO_REG_OFFSET(0x14) /* 0x96 */
#define GPAFR_L_Lsb_Index   STMPE1601_GPIO_REG_OFFSET(0x15) /* 0x97 */
/*Level translator enable register */
#define GPLT_EN_Index   STMPE1601_GPIO_REG_OFFSET(0x16) /* 0x98 */
/*Level translator direction register */
#define GPLT_DIR_Index   STMPE1601_GPIO_REG_OFFSET(0x17) /* 0x99 */

#define	STMPE1601_GPIO_INT		15
#define KEYPAD_INT			(STMPE1601_GPIO_INT+1)
#define STMPE1601_MAX_INT		KEYPAD_INT

/*gpio_cfg related define*/
#define MAX_STMPE1601_GPIO		16
/*max number of STMPE1601 gpio allowed*/

/*keypad related define*/
#define STMPE1601_SCAN_ON		1
#define STMPE1601_SCAN_OFF		0

#define STMPE1601_MASK_NO_KEY	0x78 /*code for no key*/

#define STMPE1601_KEY(col, row)	(col + (row << 3))
/*macro for key definition*/

/**
* typedef struct t_stmpe1601_key_config
* Keypad configuration, platform specific settings
*/
typedef struct {
	unsigned short columns;	/* bit-field , 1=column used, 0=column
				 * not used
				 */
	unsigned short rows;	/* bit-field , 1=row used, 0=row not used */
	unsigned char  ncycles;	/* number of cycles for key data updating */
	unsigned char  debounce; /* de-bounce time (0-128)ms */
	unsigned char  scan;	/* scan status, ON or OFF*/
} t_stmpe1601_key_config;

/**
* typedef struct t_stmpe1601_key_status
* Data structure to save key status during last scan.
* E.g., no of keys pressed/released etc
*/
typedef struct {
	unsigned char button_pressed; /* number of button pressed */
	unsigned char button[5];    /* id of buttons, 0 to 77 */
	unsigned char button_released;	/* number of button released */
	unsigned char released[5];	/* id of buttons released, 0 to 77 */
} t_stmpe1601_key_status;

/**
* typedef struct t_stmpe1601_device_config
* General configuration
*/
typedef struct {
	unsigned char sys_con;
	unsigned char sys_con_2;
	t_stmpe1601_key_config	key_cfg;	/*not used*/
} t_stmpe1601_device_config;

/**
* typedef struct t_stmpe1601_info
* general device info
*/
typedef struct {
	unsigned char chip_id;
	unsigned char version_id;
} t_stmpe1601_info;

/**
* typedef struct t_stmpe1601_syscon_ds
* data structire to save control register settings
*/
typedef struct {
	unsigned char syscon_data;
	unsigned char syscon_2_data;
} t_stmpe1601_syscon_ds;

/**
* typedef struct t_stmpe1601_interrupt_ds
* data structure to save interrupt controllder register values
*/
typedef struct {
	/*ICR register info*/
	unsigned char icr_msb_data;
	unsigned char icr_lsb_data;

	/*IER register info*/
	unsigned char ier_msb_data;
	unsigned char ier_lsb_data;

	/*ISR register info*/
	unsigned char isr_msb_data;
	unsigned char isr_lsb_data;

	/*IEGPIOR register info*/
	unsigned char iegpior_msb_data;
	unsigned char iegpior_lsb_data;

	/*ISGPIOR register info*/
	unsigned char isgpior_msb_data;
	unsigned char isgpior_lsb_data;
} t_stmpe1601_interrupt_ds;

/**
* typedef struct t_stmpe1601_kpc_ds
* Data structure to save kpd controller resgister values
*/
typedef struct {
	unsigned char kpc_col_data;
	unsigned char kpc_row_msb_data;
	unsigned char kpc_row_lsb_data;
	unsigned char kpc_ctrl_msb_data;
	unsigned char kpc_ctrl_lsb_data;
	unsigned char kpc_data_byte0_data;
	unsigned char kpc_data_byte1_data;
	unsigned char kpc_data_byte2_data;
	unsigned char kpc_data_byte3_data;
	unsigned char kpc_data_byte4_data;
	unsigned char kpc_data_byte5_data;
} t_stmpe1601_kpc_ds;

/**
* struct stmpe1601_platform_data
* Pltform data to save gpio base address
* @gpio_base:	start index for STMPE1601 expanded gpio:
* 268+24 for u8500 platform
* @irq:	Interrupt no. for STMPE1601, For U8500 platform interrupt
* is through GPIO218
*/
struct stmpe1601_platform_data {
	unsigned	gpio_base;
	int irq;
};

/*
* interrupt handler regiser and unregister functions
*/

/**
* stmpe1601_remove_callback() - remove a callback handler
* @irq:        gpio number
* This funtion removes the callback handler for the client device
*/
int stmpe1601_remove_callback(int irq);

/**
* stmpe1601_set_callback() - install a callback handler
* @irq:        gpio number
* @handler:    funtion pointer to the callback handler
* @data:       data pointer to be passed to the specific handler
* This funtion install the callback handler for the client device
*/
int stmpe1601_set_callback(int irq, void *handler, void *data);

/*
* keypad related functions
*/

/**
 * stmpe1601_keypad_init - initialises Keypad matrix row and columns
 * @kpconfig:    keypad configuration for a platform
 * This function configures keypad control registers of stmpe1601
 * The keypad driver should call this function to configure keypad matrix
 *
 */
int stmpe1601_keypad_init(t_stmpe1601_key_config kpconfig);
/**
 * stmpe1601_keypad_scan: start/stop keypad scannig
 * @status:    flag for enable/disable STMPE1601_SCAN_ON or STMPE1601_SCAN_OFF
 *
 */
int stmpe1601_keypad_scan(unsigned char status);

/**
 * stmpe1601_keypressed :  This function read keypad data registers
 * @keys: o/p parameter, returns keys pressed.
 * This function can be used in both polling or interrupt usage.
 */
int stmpe1601_keypressed(t_stmpe1601_key_status *keys);
/**
 * stmpe1601_read_info() - read the chip information
 * This function read stmpe1601 chip and version ID
 * and returns error if chip id or version id is not correct.
 * This function can be called to check if UIB is connected or not.
 */
int stmpe1601_read_info(void);

/**
* stmpe1601_irqen() - enables corresponding interrupt mask
* @irq:         interrupt no.
*/
int stmpe1601_irqen(int irq);
/**
* stmpe1601_irqdis() - disables corresponding interrupt mask
* @irq:         interrupt no.
**/
int stmpe1601_irqdis(int irq);

#endif