blob: a2d82dce62d75126d7af7a9aa9faa2350bed6912 [file] [log] [blame]
Marc Dietrich32890b92011-05-19 16:34:42 +02001#ifndef __LINUX_MFD_NVEC
2#define __LINUX_MFD_NVEC
3
4#include <linux/semaphore.h>
5
6typedef enum {
7 NVEC_2BYTES,
8 NVEC_3BYTES,
9 NVEC_VAR_SIZE
10} nvec_size;
11
12typedef enum {
13 NOT_REALLY,
14 YES,
15 NOT_AT_ALL,
16} how_care;
17
18typedef enum {
19 NVEC_SYS=1,
20 NVEC_BAT,
21 NVEC_KBD = 5,
22 NVEC_PS2,
23 NVEC_CNTL,
24 NVEC_KB_EVT = 0x80,
25 NVEC_PS2_EVT
26} nvec_event;
27
28typedef enum {
29 NVEC_WAIT,
30 NVEC_READ,
31 NVEC_WRITE
32} nvec_state;
33
34struct nvec_msg {
35 unsigned char *data;
36 unsigned short size;
37 unsigned short pos;
38 struct list_head node;
39};
40
41struct nvec_subdev {
42 const char *name;
43 void *platform_data;
44 int id;
45};
46
47struct nvec_platform_data {
48 int num_subdevs;
49 int i2c_addr;
50 int gpio;
51 int irq;
52 int base;
53 int size;
54 char clock[16];
55 struct nvec_subdev *subdevs;
56};
57
58struct nvec_chip {
59 struct device *dev;
60 int gpio;
61 int irq;
62 unsigned char *i2c_regs;
63 nvec_state state;
64 struct atomic_notifier_head notifier_list;
65 struct list_head rx_data, tx_data;
66 struct notifier_block nvec_status_notifier;
67 struct work_struct rx_work, tx_work;
68 struct nvec_msg *rx, *tx;
69
70/* sync write stuff */
71 struct semaphore sync_write_mutex;
72 struct completion sync_write;
73 u16 sync_write_pending;
74 struct nvec_msg *last_sync_msg;
75};
76
77extern void nvec_write_async(struct nvec_chip *nvec, unsigned char *data, short size);
78
79extern int nvec_register_notifier(struct nvec_chip *nvec,
80 struct notifier_block *nb, unsigned int events);
81
82extern int nvec_unregister_notifier(struct device *dev,
83 struct notifier_block *nb, unsigned int events);
84
85const char *nvec_send_msg(unsigned char *src, unsigned char *dst_size, how_care care_resp, void (*rt_handler)(unsigned char *data));
86
87extern int nvec_ps2(struct nvec_chip *nvec);
88extern int nvec_kbd_init(struct nvec_chip *nvec);
89
90#define I2C_CNFG 0x00
91#define I2C_CNFG_PACKET_MODE_EN (1<<10)
92#define I2C_CNFG_NEW_MASTER_SFM (1<<11)
93#define I2C_CNFG_DEBOUNCE_CNT_SHIFT 12
94
95#define I2C_SL_CNFG 0x20
96#define I2C_SL_NEWL (1<<2)
97#define I2C_SL_NACK (1<<1)
98#define I2C_SL_RESP (1<<0)
99#define I2C_SL_IRQ (1<<3)
100#define END_TRANS (1<<4)
101#define RCVD (1<<2)
102#define RNW (1<<1)
103
104#define I2C_SL_RCVD 0x24
105#define I2C_SL_STATUS 0x28
106#define I2C_SL_ADDR1 0x2c
107#define I2C_SL_ADDR2 0x30
108#define I2C_SL_DELAY_COUNT 0x3c
109
110#endif