aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/mach-ux500/include/mach/kpd.h
blob: 4617746607874873ad8c4b1f34cd7fd16c74bc67 (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
/*
 * Copyright STMicroelectronics, 2009.
 * Copyright (C) 2009 ST-Ericsson SA
 *
 * 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 __U8500_KPD_H
#define __U8500_KPD_H

#ifndef CONFIG_AUTOSCAN_ENABLED
#define CONFIG_AUTOSCAN_ENABLED 1
#endif
#include <mach/hardware.h>

#define MAX_KPROW               8
#define MAX_KPCOL               8
/*keypad related Constants*/
#define KEYPAD_RELEASE_PERIOD   11	/*110 Msec, repeate key scan time */
#define KEYPAD_SCAN_PERIOD      4	/*40Msec for new keypress */
#define KEYPAD_STATE_DEFAULT    0
#define KEYPAD_STATE_PRESSED    1
#define KEYPAD_STATE_PRESSACK   2
#define KEYPAD_STATE_RELEASED   3
#define KEYPAD_STATE_RELEASEACK 2

#define KPINTR_LKBIT		0	/*bit used for interrupt locking */

struct keypad_t;
/**
 * struct keypad_device - Device data structure for platform specific data
 * @init:		pointer to keypad init function
 * @exit:		pointer to keypad deinitialisation function
 * @autoscan_check:	pointer to read autoscan status function, not used
 *			currently
 * @autoscan_disable:	pointer to autoscan feature disable function,
 *			not used currently
 * @autoscan_results:	pointer to read autoscan results function
 * @autoscan_en:	pointer to enable autoscan feature function, not used
 *			currently
 * @irqen:		pointer to enable irq function
 * @irqdis:		pointer to disable irq function
 * @kcode_tbl:		lookup table for keycodes
 * @krow:		mask for available rows, value is 0xFF
 * @kcol:               mask for available columns, value is 0xFF
 * @irqdis_int:		pointer to disable irq function, to be called from ISR
 * @debounce_period:	platform specific debounce time, can be fine tuned later
 * @irqtype:		type of interrupt
 * @irq:		irq no,
 * @int_status:		interrupt status
 * @int_line_behaviour:	dynamis interrupt line behaviour
 * @enable_wakeup:	specifies if keypad event can wake up system from sleep
 */
struct keypad_device {
	int	(*init)(struct keypad_t *kp);
	int 	(*exit)(struct keypad_t *kp);
	int 	(*autoscan_check)(void);
	void 	(*autoscan_disable)(void);
	int 	(*autoscan_results)(struct keypad_t *kp);
	void 	(*autoscan_en)(void);
	int 	(*irqen)(struct keypad_t *kp);
	int 	(*irqdis)(struct keypad_t *kp); /* normal disable */
	u8 	*kcode_tbl;
	u8 	krow;
	u8 	kcol;
	int 	(*irqdis_int)(struct keypad_t *kp);
	/* func used wen disable in interrupt handler */
	u8 	debounce_period;
	unsigned long	irqtype;
	u8	irq; /*IRQ no*/
	u8      int_status;
	u8 	int_line_behaviour;
	bool	enable_wakeup;
};

/**
 * struct keypad_t - keypad data structure used internally by keypad driver
 * @irq:		irq no
 * @mode:		0 for interrupt mode, 1 for polling mode
 * @key_state:		array for saving keystates
 * @lockbits: 		used for synchronisation in ISR
 * @inp_dev:		pointer to input device object
 * @address_for_data:	not used
 * @kscan_work:		work queue
 * @board: 		keypad platform device
 */
struct keypad_t {
	int irq;
	int mode;
	int key_state[MAX_KPROW][MAX_KPCOL];
	unsigned long lockbits;
	struct input_dev *inp_dev;
	void *address_for_data;
	struct delayed_work kscan_work;
	struct keypad_device *board;
};
/**
 * enum kp_int_status - enum for INTR status
 * @KP_INT_DISABLED:	interrupt disabled
 * @KP_INT_ENABLED:	interrupt enabled
 */
enum kp_int_status {
	KP_INT_DISABLED = 0,
	KP_INT_ENABLED,
};
/**
 *enum kp_int_line_behaviour - enum for kp_int_line dynamic status
 * @INT_LINE_NOTSET: 	IRQ not asserted
 * @INT_LINE_SET: 	IRQ asserted
 */
enum kp_int_line_behaviour {
	INT_LINE_NOTSET = 0,
	INT_LINE_SET,
};
#endif	/*__U8500_KPD_H*/