1#include <media/saa7146_vv.h>
2
3static u32 saa7146_i2c_func(struct i2c_adapter *adapter)
4{
5//fm	DEB_I2C(("'%s'.\n", adapter->name));
6
7	return	  I2C_FUNC_I2C
8		| I2C_FUNC_SMBUS_QUICK
9		| I2C_FUNC_SMBUS_READ_BYTE	| I2C_FUNC_SMBUS_WRITE_BYTE
10		| I2C_FUNC_SMBUS_READ_BYTE_DATA | I2C_FUNC_SMBUS_WRITE_BYTE_DATA;
11}
12
13/* this function returns the status-register of our i2c-device */
14static inline u32 saa7146_i2c_status(struct saa7146_dev *dev)
15{
16	u32 iicsta = saa7146_read(dev, I2C_STATUS);
17/*
18	DEB_I2C(("status: 0x%08x\n",iicsta));
19*/
20	return iicsta;
21}
22
23/* this function runs through the i2c-messages and prepares the data to be
24   sent through the saa7146. have a look at the specifications p. 122 ff
25   to understand this. it returns the number of u32s to send, or -1
26   in case of an error. */
27static int saa7146_i2c_msg_prepare(const struct i2c_msg *m, int num, u32 *op)
28{
29	int h1, h2;
30	int i, j, addr;
31	int mem = 0, op_count = 0;
32
33	/* first determine size of needed memory */
34	for(i = 0; i < num; i++) {
35		mem += m[i].len + 1;
36	}
37
38	/* worst case: we need one u32 for three bytes to be send
39	   plus one extra byte to address the device */
40	mem = 1 + ((mem-1) / 3);
41
42	/* we assume that op points to a memory of at least SAA7146_I2C_MEM bytes
43	   size. if we exceed this limit... */
44	if ( (4*mem) > SAA7146_I2C_MEM ) {
45//fm		DEB_I2C(("cannot prepare i2c-message.\n"));
46		return -ENOMEM;
47	}
48
49	/* be careful: clear out the i2c-mem first */
50	memset(op,0,sizeof(u32)*mem);
51
52	/* loop through all messages */
53	for(i = 0; i < num; i++) {
54
55		/* insert the address of the i2c-slave.
56		   note: we get 7 bit i2c-addresses,
57		   so we have to perform a translation */
58		addr = (m[i].addr*2) + ( (0 != (m[i].flags & I2C_M_RD)) ? 1 : 0);
59		h1 = op_count/3; h2 = op_count%3;
60		op[h1] |= (	    (u8)addr << ((3-h2)*8));
61		op[h1] |= (SAA7146_I2C_START << ((3-h2)*2));
62		op_count++;
63
64		/* loop through all bytes of message i */
65		for(j = 0; j < m[i].len; j++) {
66			/* insert the data bytes */
67			h1 = op_count/3; h2 = op_count%3;
68			op[h1] |= ( (u32)((u8)m[i].buf[j]) << ((3-h2)*8));
69			op[h1] |= (       SAA7146_I2C_CONT << ((3-h2)*2));
70			op_count++;
71		}
72
73	}
74
75	/* have a look at the last byte inserted:
76	  if it was: ...CONT change it to ...STOP */
77	h1 = (op_count-1)/3; h2 = (op_count-1)%3;
78	if ( SAA7146_I2C_CONT == (0x3 & (op[h1] >> ((3-h2)*2))) ) {
79		op[h1] &= ~(0x2 << ((3-h2)*2));
80		op[h1] |= (SAA7146_I2C_STOP << ((3-h2)*2));
81	}
82
83	/* return the number of u32s to send */
84	return mem;
85}
86
87static int saa7146_i2c_msg_cleanup(const struct i2c_msg *m, int num, u32 *op)
88{
89	int i, j;
90	int op_count = 0;
91
92	/* loop through all messages */
93	for(i = 0; i < num; i++) {
94
95		op_count++;
96
97		/* loop throgh all bytes of message i */
98		for(j = 0; j < m[i].len; j++) {
99			/* write back all bytes that could have been read */
100			m[i].buf[j] = (op[op_count/3] >> ((3-(op_count%3))*8));
101			op_count++;
102		}
103	}
104
105	return 0;
106}
107
108/* this functions resets the i2c-device and returns 0 if everything was fine, otherwise -1 */
109static int saa7146_i2c_reset(struct saa7146_dev *dev)
110{
111	/* get current status */
112	u32 status = saa7146_i2c_status(dev);
113
114	/* clear registers for sure */
115	saa7146_write(dev, I2C_STATUS, dev->i2c_bitrate);
116	saa7146_write(dev, I2C_TRANSFER, 0);
117
118	/* check if any operation is still in progress */
119	if ( 0 != ( status & SAA7146_I2C_BUSY) ) {
120
121		/* yes, kill ongoing operation */
122		DEB_I2C(("busy_state detected.\n"));
123
124		/* set "ABORT-OPERATION"-bit (bit 7)*/
125		saa7146_write(dev, I2C_STATUS, (dev->i2c_bitrate | MASK_07));
126		saa7146_write(dev, MC2, (MASK_00 | MASK_16));
127		msleep(SAA7146_I2C_DELAY);
128
129		/* clear all error-bits pending; this is needed because p.123, note 1 */
130		saa7146_write(dev, I2C_STATUS, dev->i2c_bitrate);
131		saa7146_write(dev, MC2, (MASK_00 | MASK_16));
132		msleep(SAA7146_I2C_DELAY);
133	}
134
135	/* check if any error is (still) present. (this can be necessary because p.123, note 1) */
136	status = saa7146_i2c_status(dev);
137
138	if ( dev->i2c_bitrate != status ) {
139
140		DEB_I2C(("error_state detected. status:0x%08x\n",status));
141
142		/* Repeat the abort operation. This seems to be necessary
143		   after serious protocol errors caused by e.g. the SAA7740 */
144		saa7146_write(dev, I2C_STATUS, (dev->i2c_bitrate | MASK_07));
145		saa7146_write(dev, MC2, (MASK_00 | MASK_16));
146		msleep(SAA7146_I2C_DELAY);
147
148		/* clear all error-bits pending */
149		saa7146_write(dev, I2C_STATUS, dev->i2c_bitrate);
150		saa7146_write(dev, MC2, (MASK_00 | MASK_16));
151		msleep(SAA7146_I2C_DELAY);
152
153		/* the data sheet says it might be necessary to clear the status
154		   twice after an abort */
155		saa7146_write(dev, I2C_STATUS, dev->i2c_bitrate);
156		saa7146_write(dev, MC2, (MASK_00 | MASK_16));
157		msleep(SAA7146_I2C_DELAY);
158	}
159
160	/* if any error is still present, a fatal error has occured ... */
161	status = saa7146_i2c_status(dev);
162	if ( dev->i2c_bitrate != status ) {
163		DEB_I2C(("fatal error. status:0x%08x\n",status));
164		return -1;
165	}
166
167	return 0;
168}
169
170/* this functions writes out the data-byte 'dword' to the i2c-device.
171   it returns 0 if ok, -1 if the transfer failed, -2 if the transfer
172   failed badly (e.g. address error) */
173static int saa7146_i2c_writeout(struct saa7146_dev *dev, u32* dword, int short_delay)
174{
175	u32 status = 0, mc2 = 0;
176	int trial = 0;
177	unsigned long timeout;
178
179	/* write out i2c-command */
180	DEB_I2C(("before: 0x%08x (status: 0x%08x), %d\n",*dword,saa7146_read(dev, I2C_STATUS), dev->i2c_op));
181
182	if( 0 != (SAA7146_USE_I2C_IRQ & dev->ext->flags)) {
183
184		saa7146_write(dev, I2C_STATUS,	 dev->i2c_bitrate);
185		saa7146_write(dev, I2C_TRANSFER, *dword);
186
187		dev->i2c_op = 1;
188		SAA7146_ISR_CLEAR(dev, MASK_16|MASK_17);
189		SAA7146_IER_ENABLE(dev, MASK_16|MASK_17);
190		saa7146_write(dev, MC2, (MASK_00 | MASK_16));
191
192		timeout = HZ/100 + 1; /* 10ms */
193		timeout = wait_event_interruptible_timeout(dev->i2c_wq, dev->i2c_op == 0, timeout);
194		if (timeout == -ERESTARTSYS || dev->i2c_op) {
195			SAA7146_IER_DISABLE(dev, MASK_16|MASK_17);
196			SAA7146_ISR_CLEAR(dev, MASK_16|MASK_17);
197			if (timeout == -ERESTARTSYS)
198				/* a signal arrived */
199				return -ERESTARTSYS;
200
201			printk(KERN_WARNING "saa7146_i2c_writeout: timed out waiting for end of xfer\n");
202			return -EIO;
203		}
204		status = saa7146_read(dev, I2C_STATUS);
205	} else {
206		saa7146_write(dev, I2C_STATUS,	 dev->i2c_bitrate);
207		saa7146_write(dev, I2C_TRANSFER, *dword);
208		saa7146_write(dev, MC2, (MASK_00 | MASK_16));
209
210		/* do not poll for i2c-status before upload is complete */
211		timeout = jiffies + HZ/100 + 1; /* 10ms */
212		while(1) {
213			mc2 = (saa7146_read(dev, MC2) & 0x1);
214			if( 0 != mc2 ) {
215				break;
216			}
217			if (time_after(jiffies,timeout)) {
218				printk(KERN_WARNING "saa7146_i2c_writeout: timed out waiting for MC2\n");
219				return -EIO;
220			}
221		}
222		/* wait until we get a transfer done or error */
223		timeout = jiffies + HZ/100 + 1; /* 10ms */
224		/* first read usually delivers bogus results... */
225		saa7146_i2c_status(dev);
226		while(1) {
227			status = saa7146_i2c_status(dev);
228			if ((status & 0x3) != 1)
229				break;
230			if (time_after(jiffies,timeout)) {
231				/* this is normal when probing the bus
232				 * (no answer from nonexisistant device...)
233				 */
234				DEB_I2C(("saa7146_i2c_writeout: timed out waiting for end of xfer\n"));
235				return -EIO;
236			}
237			if (++trial < 50 && short_delay)
238				udelay(10);
239			else
240				msleep(1);
241		}
242	}
243
244	/* give a detailed status report */
245	if ( 0 != (status & SAA7146_I2C_ERR)) {
246
247		if( 0 != (status & SAA7146_I2C_SPERR) ) {
248			DEB_I2C(("error due to invalid start/stop condition.\n"));
249		}
250		if( 0 != (status & SAA7146_I2C_DTERR) ) {
251			DEB_I2C(("error in data transmission.\n"));
252		}
253		if( 0 != (status & SAA7146_I2C_DRERR) ) {
254			DEB_I2C(("error when receiving data.\n"));
255		}
256		if( 0 != (status & SAA7146_I2C_AL) ) {
257			DEB_I2C(("error because arbitration lost.\n"));
258		}
259
260		/* we handle address-errors here */
261		if( 0 != (status & SAA7146_I2C_APERR) ) {
262			DEB_I2C(("error in address phase.\n"));
263			return -EREMOTEIO;
264		}
265
266		return -EIO;
267	}
268
269	/* read back data, just in case we were reading ... */
270	*dword = saa7146_read(dev, I2C_TRANSFER);
271
272	DEB_I2C(("after: 0x%08x\n",*dword));
273	return 0;
274}
275
276int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg *msgs, int num, int retries)
277{
278	int i = 0, count = 0;
279	u32* buffer = dev->d_i2c.cpu_addr;
280	int err = 0;
281	int address_err = 0;
282	int short_delay = 0;
283
284	if (mutex_lock_interruptible(&dev->i2c_lock))
285		return -ERESTARTSYS;
286
287	for(i=0;i<num;i++) {
288		DEB_I2C(("msg:%d/%d\n",i+1,num));
289	}
290
291	/* prepare the message(s), get number of u32s to transfer */
292	count = saa7146_i2c_msg_prepare(msgs, num, buffer);
293	if ( 0 > count ) {
294		err = -1;
295		goto out;
296	}
297
298	if ( count > 3 || 0 != (SAA7146_I2C_SHORT_DELAY & dev->ext->flags) )
299		short_delay = 1;
300
301	do {
302		/* reset the i2c-device if necessary */
303		err = saa7146_i2c_reset(dev);
304		if ( 0 > err ) {
305			DEB_I2C(("could not reset i2c-device.\n"));
306			goto out;
307		}
308
309		/* write out the u32s one after another */
310		for(i = 0; i < count; i++) {
311			err = saa7146_i2c_writeout(dev, &buffer[i], short_delay);
312			if ( 0 != err) {
313				/* this one is unsatisfying: some i2c slaves on some
314				   dvb cards don't acknowledge correctly, so the saa7146
315				   thinks that an address error occured. in that case, the
316				   transaction should be retrying, even if an address error
317				   occured. analog saa7146 based cards extensively rely on
318				   i2c address probing, however, and address errors indicate that a
319				   device is really *not* there. retrying in that case
320				   increases the time the device needs to probe greatly, so
321				   it should be avoided. because of the fact, that only
322				   analog based cards use irq based i2c transactions (for dvb
323				   cards, this screwes up other interrupt sources), we bail out
324				   completely for analog cards after an address error and trust
325				   the saa7146 address error detection. */
326				if ( -EREMOTEIO == err ) {
327					if( 0 != (SAA7146_USE_I2C_IRQ & dev->ext->flags)) {
328						goto out;
329					}
330					address_err++;
331				}
332				DEB_I2C(("error while sending message(s). starting again.\n"));
333				break;
334			}
335		}
336		if( 0 == err ) {
337			err = num;
338			break;
339		}
340
341		/* delay a bit before retrying */
342		msleep(10);
343
344	} while (err != num && retries--);
345
346	/* if every retry had an address error, exit right away */
347	if (address_err == retries) {
348		goto out;
349	}
350
351	/* if any things had to be read, get the results */
352	if ( 0 != saa7146_i2c_msg_cleanup(msgs, num, buffer)) {
353		DEB_I2C(("could not cleanup i2c-message.\n"));
354		err = -1;
355		goto out;
356	}
357
358	/* return the number of delivered messages */
359	DEB_I2C(("transmission successful. (msg:%d).\n",err));
360out:
361	/* another bug in revision 0: the i2c-registers get uploaded randomly by other
362	   uploads, so we better clear them out before continueing */
363	if( 0 == dev->revision ) {
364		u32 zero = 0;
365		saa7146_i2c_reset(dev);
366		if( 0 != saa7146_i2c_writeout(dev, &zero, short_delay)) {
367			INFO(("revision 0 error. this should never happen.\n"));
368		}
369	}
370
371	mutex_unlock(&dev->i2c_lock);
372	return err;
373}
374
375/* utility functions */
376static int saa7146_i2c_xfer(struct i2c_adapter* adapter, struct i2c_msg *msg, int num)
377{
378	struct saa7146_dev* dev = i2c_get_adapdata(adapter);
379
380	/* use helper function to transfer data */
381	return saa7146_i2c_transfer(dev, msg, num, adapter->retries);
382}
383
384
385/*****************************************************************************/
386/* i2c-adapter helper functions                                              */
387#include <linux/i2c-id.h>
388
389/* exported algorithm data */
390static struct i2c_algorithm saa7146_algo = {
391	.master_xfer	= saa7146_i2c_xfer,
392	.functionality	= saa7146_i2c_func,
393};
394
395int saa7146_i2c_adapter_prepare(struct saa7146_dev *dev, struct i2c_adapter *i2c_adapter, u32 bitrate)
396{
397	DEB_EE(("bitrate: 0x%08x\n",bitrate));
398
399	/* enable i2c-port pins */
400	saa7146_write(dev, MC1, (MASK_08 | MASK_24));
401
402	dev->i2c_bitrate = bitrate;
403	saa7146_i2c_reset(dev);
404
405	if( NULL != i2c_adapter ) {
406		BUG_ON(!i2c_adapter->class);
407		i2c_set_adapdata(i2c_adapter,dev);
408		i2c_adapter->dev.parent    = &dev->pci->dev;
409		i2c_adapter->algo	   = &saa7146_algo;
410		i2c_adapter->algo_data     = NULL;
411		i2c_adapter->id		   = I2C_HW_SAA7146;
412		i2c_adapter->timeout = SAA7146_I2C_TIMEOUT;
413		i2c_adapter->retries = SAA7146_I2C_RETRIES;
414	}
415
416	return 0;
417}
418