[TG3]: Set minimal hw interrupt mitigation.
[linux-2.6/verdex.git] / drivers / sbus / char / vfc_i2c.c
blob95e3cebf792cf8775a1437b884c4bfdf5808e063
1 /*
2 * drivers/sbus/char/vfc_i2c.c
4 * Driver for the Videopix Frame Grabber.
5 *
6 * Functions that support the Phillips i2c(I squared C) bus on the vfc
7 * Documentation for the Phillips I2C bus can be found on the
8 * phillips home page
10 * Copyright (C) 1996 Manish Vachharajani (mvachhar@noc.rutgers.edu)
14 /* NOTE: It seems to me that the documentation regarding the
15 pcd8584t/pcf8584 does not show the correct way to address the i2c bus.
16 Based on the information on the I2C bus itself and the remainder of
17 the Phillips docs the following algorithims apper to be correct. I am
18 fairly certain that the flowcharts in the phillips docs are wrong. */
21 #include <linux/kernel.h>
22 #include <linux/string.h>
23 #include <linux/slab.h>
24 #include <linux/errno.h>
25 #include <linux/sched.h>
26 #include <linux/wait.h>
27 #include <linux/delay.h>
28 #include <asm/openprom.h>
29 #include <asm/oplib.h>
30 #include <asm/io.h>
31 #include <asm/system.h>
32 #include <asm/sbus.h>
34 #if 0
35 #define VFC_I2C_DEBUG
36 #endif
38 #include "vfc.h"
39 #include "vfc_i2c.h"
41 #define WRITE_S1(__val) \
42 sbus_writel(__val, &dev->regs->i2c_s1)
43 #define WRITE_REG(__val) \
44 sbus_writel(__val, &dev->regs->i2c_reg)
46 #define VFC_I2C_READ (0x1)
47 #define VFC_I2C_WRITE (0x0)
49 /******
50 The i2c bus controller chip on the VFC is a pcd8584t, but
51 phillips claims it doesn't exist. As far as I can tell it is
52 identical to the PCF8584 so I treat it like it is the pcf8584.
54 NOTE: The pcf8584 only cares
55 about the msb of the word you feed it
56 *****/
58 int vfc_pcf8584_init(struct vfc_dev *dev)
60 /* This will also choose register S0_OWN so we can set it. */
61 WRITE_S1(RESET);
63 /* The pcf8584 shifts this value left one bit and uses
64 * it as its i2c bus address.
66 WRITE_REG(0x55000000);
68 /* This will set the i2c bus at the same speed sun uses,
69 * and set another magic bit.
71 WRITE_S1(SELECT(S2));
72 WRITE_REG(0x14000000);
74 /* Enable the serial port, idle the i2c bus and set
75 * the data reg to s0.
77 WRITE_S1(CLEAR_I2C_BUS);
78 udelay(100);
79 return 0;
82 void vfc_i2c_delay_wakeup(struct vfc_dev *dev)
84 /* Used to profile code and eliminate too many delays */
85 VFC_I2C_DEBUG_PRINTK(("vfc%d: Delaying\n", dev->instance));
86 wake_up(&dev->poll_wait);
89 void vfc_i2c_delay_no_busy(struct vfc_dev *dev, unsigned long usecs)
91 init_timer(&dev->poll_timer);
92 dev->poll_timer.expires = jiffies +
93 ((unsigned long)usecs*(HZ))/1000000;
94 dev->poll_timer.data=(unsigned long)dev;
95 dev->poll_timer.function=(void *)(unsigned long)vfc_i2c_delay_wakeup;
96 add_timer(&dev->poll_timer);
97 sleep_on(&dev->poll_wait);
98 del_timer(&dev->poll_timer);
101 void inline vfc_i2c_delay(struct vfc_dev *dev)
103 vfc_i2c_delay_no_busy(dev, 100);
106 int vfc_init_i2c_bus(struct vfc_dev *dev)
108 WRITE_S1(ENABLE_SERIAL | SELECT(S0) | ACK);
109 vfc_i2c_reset_bus(dev);
110 return 0;
113 int vfc_i2c_reset_bus(struct vfc_dev *dev)
115 VFC_I2C_DEBUG_PRINTK((KERN_DEBUG "vfc%d: Resetting the i2c bus\n",
116 dev->instance));
117 if(dev == NULL)
118 return -EINVAL;
119 if(dev->regs == NULL)
120 return -EINVAL;
121 WRITE_S1(SEND_I2C_STOP);
122 WRITE_S1(SEND_I2C_STOP | ACK);
123 vfc_i2c_delay(dev);
124 WRITE_S1(CLEAR_I2C_BUS);
125 VFC_I2C_DEBUG_PRINTK((KERN_DEBUG "vfc%d: I2C status %x\n",
126 dev->instance,
127 sbus_readl(&dev->regs->i2c_s1)));
128 return 0;
131 int vfc_i2c_wait_for_bus(struct vfc_dev *dev)
133 int timeout = 1000;
135 while(!(sbus_readl(&dev->regs->i2c_s1) & BB)) {
136 if(!(timeout--))
137 return -ETIMEDOUT;
138 vfc_i2c_delay(dev);
140 return 0;
143 int vfc_i2c_wait_for_pin(struct vfc_dev *dev, int ack)
145 int timeout = 1000;
146 int s1;
148 while ((s1 = sbus_readl(&dev->regs->i2c_s1)) & PIN) {
149 if (!(timeout--))
150 return -ETIMEDOUT;
151 vfc_i2c_delay(dev);
153 if (ack == VFC_I2C_ACK_CHECK) {
154 if(s1 & LRB)
155 return -EIO;
157 return 0;
160 #define SHIFT(a) ((a) << 24)
161 int vfc_i2c_xmit_addr(struct vfc_dev *dev, unsigned char addr, char mode)
163 int ret, raddr;
164 #if 1
165 WRITE_S1(SEND_I2C_STOP | ACK);
166 WRITE_S1(SELECT(S0) | ENABLE_SERIAL);
167 vfc_i2c_delay(dev);
168 #endif
170 switch(mode) {
171 case VFC_I2C_READ:
172 raddr = SHIFT(((unsigned int)addr | 0x1));
173 WRITE_REG(raddr);
174 VFC_I2C_DEBUG_PRINTK(("vfc%d: receiving from i2c addr 0x%x\n",
175 dev->instance, addr | 0x1));
176 break;
177 case VFC_I2C_WRITE:
178 raddr = SHIFT((unsigned int)addr & ~0x1);
179 WRITE_REG(raddr);
180 VFC_I2C_DEBUG_PRINTK(("vfc%d: sending to i2c addr 0x%x\n",
181 dev->instance, addr & ~0x1));
182 break;
183 default:
184 return -EINVAL;
187 WRITE_S1(SEND_I2C_START);
188 vfc_i2c_delay(dev);
189 ret = vfc_i2c_wait_for_pin(dev,VFC_I2C_ACK_CHECK); /* We wait
190 for the
191 i2c send
192 to finish
193 here but
195 doesn't,
196 hmm */
197 if (ret) {
198 printk(KERN_ERR "vfc%d: VFC xmit addr timed out or no ack\n",
199 dev->instance);
200 return ret;
201 } else if (mode == VFC_I2C_READ) {
202 if ((ret = sbus_readl(&dev->regs->i2c_reg) & 0xff000000) != raddr) {
203 printk(KERN_WARNING
204 "vfc%d: returned slave address "
205 "mismatch(%x,%x)\n",
206 dev->instance, raddr, ret);
209 return 0;
212 int vfc_i2c_xmit_byte(struct vfc_dev *dev,unsigned char *byte)
214 int ret;
215 u32 val = SHIFT((unsigned int)*byte);
217 WRITE_REG(val);
219 ret = vfc_i2c_wait_for_pin(dev, VFC_I2C_ACK_CHECK);
220 switch(ret) {
221 case -ETIMEDOUT:
222 printk(KERN_ERR "vfc%d: VFC xmit byte timed out or no ack\n",
223 dev->instance);
224 break;
225 case -EIO:
226 ret = XMIT_LAST_BYTE;
227 break;
228 default:
229 break;
232 return ret;
235 int vfc_i2c_recv_byte(struct vfc_dev *dev, unsigned char *byte, int last)
237 int ret;
239 if (last) {
240 WRITE_REG(NEGATIVE_ACK);
241 VFC_I2C_DEBUG_PRINTK(("vfc%d: sending negative ack\n",
242 dev->instance));
243 } else {
244 WRITE_S1(ACK);
247 ret = vfc_i2c_wait_for_pin(dev, VFC_I2C_NO_ACK_CHECK);
248 if(ret) {
249 printk(KERN_ERR "vfc%d: "
250 "VFC recv byte timed out\n",
251 dev->instance);
253 *byte = (sbus_readl(&dev->regs->i2c_reg)) >> 24;
254 return ret;
257 int vfc_i2c_recvbuf(struct vfc_dev *dev, unsigned char addr,
258 char *buf, int count)
260 int ret, last;
262 if(!(count && buf && dev && dev->regs) )
263 return -EINVAL;
265 if ((ret = vfc_i2c_wait_for_bus(dev))) {
266 printk(KERN_ERR "vfc%d: VFC I2C bus busy\n", dev->instance);
267 return ret;
270 if ((ret = vfc_i2c_xmit_addr(dev, addr, VFC_I2C_READ))) {
271 WRITE_S1(SEND_I2C_STOP);
272 vfc_i2c_delay(dev);
273 return ret;
276 last = 0;
277 while (count--) {
278 if (!count)
279 last = 1;
280 if ((ret = vfc_i2c_recv_byte(dev, buf, last))) {
281 printk(KERN_ERR "vfc%d: "
282 "VFC error while receiving byte\n",
283 dev->instance);
284 WRITE_S1(SEND_I2C_STOP);
285 ret = -EINVAL;
287 buf++;
289 WRITE_S1(SEND_I2C_STOP | ACK);
290 vfc_i2c_delay(dev);
291 return ret;
294 int vfc_i2c_sendbuf(struct vfc_dev *dev, unsigned char addr,
295 char *buf, int count)
297 int ret;
299 if (!(buf && dev && dev->regs))
300 return -EINVAL;
302 if ((ret = vfc_i2c_wait_for_bus(dev))) {
303 printk(KERN_ERR "vfc%d: VFC I2C bus busy\n", dev->instance);
304 return ret;
307 if ((ret = vfc_i2c_xmit_addr(dev, addr, VFC_I2C_WRITE))) {
308 WRITE_S1(SEND_I2C_STOP);
309 vfc_i2c_delay(dev);
310 return ret;
313 while(count--) {
314 ret = vfc_i2c_xmit_byte(dev, buf);
315 switch(ret) {
316 case XMIT_LAST_BYTE:
317 VFC_I2C_DEBUG_PRINTK(("vfc%d: "
318 "Receiver ended transmission with "
319 " %d bytes remaining\n",
320 dev->instance, count));
321 ret = 0;
322 goto done;
323 break;
324 case 0:
325 break;
326 default:
327 printk(KERN_ERR "vfc%d: "
328 "VFC error while sending byte\n", dev->instance);
329 break;
332 buf++;
334 done:
335 WRITE_S1(SEND_I2C_STOP | ACK);
336 vfc_i2c_delay(dev);
337 return ret;