1 #ifndef __I2C_KEYWEST_H__
2 #define __I2C_KEYWEST_H__
3
4 /* The Tumbler audio equalizer can be really slow sometimes */
5 #define POLL_TIMEOUT (2*HZ)
6
7 /* Register indices */
8 typedef enum {
9 reg_mode = 0,
10 reg_control,
11 reg_status,
12 reg_isr,
13 reg_ier,
14 reg_addr,
15 reg_subaddr,
16 reg_data
17 } reg_t;
18
19
20 /* Mode register */
21 #define KW_I2C_MODE_100KHZ 0x00
22 #define KW_I2C_MODE_50KHZ 0x01
23 #define KW_I2C_MODE_25KHZ 0x02
24 #define KW_I2C_MODE_DUMB 0x00
25 #define KW_I2C_MODE_STANDARD 0x04
26 #define KW_I2C_MODE_STANDARDSUB 0x08
27 #define KW_I2C_MODE_COMBINED 0x0C
28 #define KW_I2C_MODE_MODE_MASK 0x0C
29 #define KW_I2C_MODE_CHAN_MASK 0xF0
30
31 /* Control register */
32 #define KW_I2C_CTL_AAK 0x01
33 #define KW_I2C_CTL_XADDR 0x02
34 #define KW_I2C_CTL_STOP 0x04
35 #define KW_I2C_CTL_START 0x08
36
37 /* Status register */
38 #define KW_I2C_STAT_BUSY 0x01
39 #define KW_I2C_STAT_LAST_AAK 0x02
40 #define KW_I2C_STAT_LAST_RW 0x04
41 #define KW_I2C_STAT_SDA 0x08
42 #define KW_I2C_STAT_SCL 0x10
43
44 /* IER & ISR registers */
45 #define KW_I2C_IRQ_DATA 0x01
46 #define KW_I2C_IRQ_ADDR 0x02
47 #define KW_I2C_IRQ_STOP 0x04
48 #define KW_I2C_IRQ_START 0x08
49 #define KW_I2C_IRQ_MASK 0x0F
50
51 /* Physical interface */
52 struct keywest_iface
53 {
54 unsigned long base;
55 unsigned bsteps;
56 int irq;
57 struct semaphore sem;
58 spinlock_t lock;
59 struct keywest_chan* channels;
60 unsigned chan_count;
61 u8 cur_mode;
62 char read_write;
63 u8* data;
64 unsigned datalen;
65 int state;
66 int result;
67 int stopretry;
68 struct timer_list timeout_timer;
69 struct completion complete;
70 struct keywest_iface* next;
71 };
72
73 enum {
74 state_idle,
75 state_addr,
76 state_read,
77 state_write,
78 state_stop,
79 state_dead
80 };
81
82 /* Channel on an interface */
83 struct keywest_chan
84 {
85 struct i2c_adapter adapter;
86 struct keywest_iface* iface;
87 unsigned chan_no;
88 };
89
90 /* Register access */
91
__read_reg(struct keywest_iface * iface,reg_t reg)92 static inline u8 __read_reg(struct keywest_iface *iface, reg_t reg)
93 {
94 return in_8(((volatile u8 *)iface->base)
95 + (((unsigned)reg) << iface->bsteps));
96 }
97
__write_reg(struct keywest_iface * iface,reg_t reg,u8 val)98 static inline void __write_reg(struct keywest_iface *iface, reg_t reg, u8 val)
99 {
100 out_8(((volatile u8 *)iface->base)
101 + (((unsigned)reg) << iface->bsteps), val);
102 (void)__read_reg(iface, reg);
103 udelay(10);
104 }
105
106 #define write_reg(reg, val) __write_reg(iface, reg, val)
107 #define read_reg(reg) __read_reg(iface, reg)
108
109
110
111 #endif /* __I2C_KEYWEST_H__ */
112