i2c-algo-bit.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. /* ------------------------------------------------------------------------- */
  2. /* i2c-algo-bit.c i2c driver algorithms for bit-shift adapters */
  3. /* ------------------------------------------------------------------------- */
  4. /* Copyright (C) 1995-2000 Simon G. Vogl
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
  16. /* ------------------------------------------------------------------------- */
  17. /* With some changes from Frodo Looijaard <frodol@dds.nl>, Kyösti Mälkki
  18. <kmalkki@cc.hut.fi> and Jean Delvare <khali@linux-fr.org> */
  19. #include <linux/kernel.h>
  20. #include <linux/module.h>
  21. #include <linux/delay.h>
  22. #include <linux/slab.h>
  23. #include <linux/init.h>
  24. #include <linux/errno.h>
  25. #include <linux/sched.h>
  26. #include <linux/i2c.h>
  27. #include <linux/i2c-algo-bit.h>
  28. /* ----- global defines ----------------------------------------------- */
  29. #define DEB(x) if (i2c_debug>=1) x;
  30. #define DEB2(x) if (i2c_debug>=2) x;
  31. #define DEBSTAT(x) if (i2c_debug>=3) x; /* print several statistical values*/
  32. #define DEBPROTO(x) if (i2c_debug>=9) { x; }
  33. /* debug the protocol by showing transferred bits */
  34. /* ----- global variables --------------------------------------------- */
  35. /* module parameters:
  36. */
  37. static int i2c_debug;
  38. static int bit_test; /* see if the line-setting functions work */
  39. /* --- setting states on the bus with the right timing: --------------- */
  40. #define setsda(adap,val) adap->setsda(adap->data, val)
  41. #define setscl(adap,val) adap->setscl(adap->data, val)
  42. #define getsda(adap) adap->getsda(adap->data)
  43. #define getscl(adap) adap->getscl(adap->data)
  44. static inline void sdalo(struct i2c_algo_bit_data *adap)
  45. {
  46. setsda(adap,0);
  47. udelay(adap->udelay);
  48. }
  49. static inline void sdahi(struct i2c_algo_bit_data *adap)
  50. {
  51. setsda(adap,1);
  52. udelay(adap->udelay);
  53. }
  54. static inline void scllo(struct i2c_algo_bit_data *adap)
  55. {
  56. setscl(adap,0);
  57. udelay(adap->udelay);
  58. }
  59. /*
  60. * Raise scl line, and do checking for delays. This is necessary for slower
  61. * devices.
  62. */
  63. static int sclhi(struct i2c_algo_bit_data *adap)
  64. {
  65. unsigned long start;
  66. setscl(adap,1);
  67. /* Not all adapters have scl sense line... */
  68. if (!adap->getscl)
  69. goto done;
  70. start=jiffies;
  71. while (! getscl(adap) ) {
  72. /* the hw knows how to read the clock line,
  73. * so we wait until it actually gets high.
  74. * This is safer as some chips may hold it low
  75. * while they are processing data internally.
  76. */
  77. if (time_after_eq(jiffies, start+adap->timeout)) {
  78. return -ETIMEDOUT;
  79. }
  80. cond_resched();
  81. }
  82. DEBSTAT(printk(KERN_DEBUG "needed %ld jiffies\n", jiffies-start));
  83. done:
  84. udelay(adap->udelay);
  85. return 0;
  86. }
  87. /* --- other auxiliary functions -------------------------------------- */
  88. static void i2c_start(struct i2c_algo_bit_data *adap)
  89. {
  90. /* assert: scl, sda are high */
  91. DEBPROTO(printk("S "));
  92. sdalo(adap);
  93. scllo(adap);
  94. }
  95. static void i2c_repstart(struct i2c_algo_bit_data *adap)
  96. {
  97. /* scl, sda may not be high */
  98. DEBPROTO(printk(" Sr "));
  99. setsda(adap,1);
  100. sclhi(adap);
  101. sdalo(adap);
  102. scllo(adap);
  103. }
  104. static void i2c_stop(struct i2c_algo_bit_data *adap)
  105. {
  106. DEBPROTO(printk("P\n"));
  107. /* assert: scl is low */
  108. sdalo(adap);
  109. sclhi(adap);
  110. sdahi(adap);
  111. }
  112. /* send a byte without start cond., look for arbitration,
  113. check ackn. from slave */
  114. /* returns:
  115. * 1 if the device acknowledged
  116. * 0 if the device did not ack
  117. * -ETIMEDOUT if an error occurred (while raising the scl line)
  118. */
  119. static int i2c_outb(struct i2c_adapter *i2c_adap, char c)
  120. {
  121. int i;
  122. int sb;
  123. int ack;
  124. struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
  125. /* assert: scl is low */
  126. for ( i=7 ; i>=0 ; i-- ) {
  127. sb = c & ( 1 << i );
  128. setsda(adap,sb);
  129. udelay(adap->udelay);
  130. DEBPROTO(printk(KERN_DEBUG "%d",sb!=0));
  131. if (sclhi(adap)<0) { /* timed out */
  132. sdahi(adap); /* we don't want to block the net */
  133. DEB2(printk(KERN_DEBUG " i2c_outb: 0x%02x, timeout at bit #%d\n", c&0xff, i));
  134. return -ETIMEDOUT;
  135. };
  136. /* do arbitration here:
  137. * if ( sb && ! getsda(adap) ) -> ouch! Get out of here.
  138. */
  139. setscl(adap, 0 );
  140. udelay(adap->udelay);
  141. }
  142. sdahi(adap);
  143. if (sclhi(adap)<0){ /* timeout */
  144. DEB2(printk(KERN_DEBUG " i2c_outb: 0x%02x, timeout at ack\n", c&0xff));
  145. return -ETIMEDOUT;
  146. };
  147. /* read ack: SDA should be pulled down by slave */
  148. ack=getsda(adap); /* ack: sda is pulled low ->success. */
  149. DEB2(printk(KERN_DEBUG " i2c_outb: 0x%02x , getsda() = %d\n", c & 0xff, ack));
  150. DEBPROTO( printk(KERN_DEBUG "[%2.2x]",c&0xff) );
  151. DEBPROTO(if (0==ack){ printk(KERN_DEBUG " A ");} else printk(KERN_DEBUG " NA ") );
  152. scllo(adap);
  153. return 0==ack; /* return 1 if device acked */
  154. /* assert: scl is low (sda undef) */
  155. }
  156. static int i2c_inb(struct i2c_adapter *i2c_adap)
  157. {
  158. /* read byte via i2c port, without start/stop sequence */
  159. /* acknowledge is sent in i2c_read. */
  160. int i;
  161. unsigned char indata=0;
  162. struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
  163. /* assert: scl is low */
  164. sdahi(adap);
  165. for (i=0;i<8;i++) {
  166. if (sclhi(adap)<0) { /* timeout */
  167. DEB2(printk(KERN_DEBUG " i2c_inb: timeout at bit #%d\n", 7-i));
  168. return -ETIMEDOUT;
  169. };
  170. indata *= 2;
  171. if ( getsda(adap) )
  172. indata |= 0x01;
  173. scllo(adap);
  174. }
  175. /* assert: scl is low */
  176. DEB2(printk(KERN_DEBUG "i2c_inb: 0x%02x\n", indata & 0xff));
  177. DEBPROTO(printk(KERN_DEBUG " 0x%02x", indata & 0xff));
  178. return (int) (indata & 0xff);
  179. }
  180. /*
  181. * Sanity check for the adapter hardware - check the reaction of
  182. * the bus lines only if it seems to be idle.
  183. */
  184. static int test_bus(struct i2c_algo_bit_data *adap, char* name) {
  185. int scl,sda;
  186. if (adap->getscl==NULL)
  187. printk(KERN_INFO "i2c-algo-bit.o: Testing SDA only, "
  188. "SCL is not readable.\n");
  189. sda=getsda(adap);
  190. scl=(adap->getscl==NULL?1:getscl(adap));
  191. printk(KERN_DEBUG "i2c-algo-bit.o: (0) scl=%d, sda=%d\n",scl,sda);
  192. if (!scl || !sda ) {
  193. printk(KERN_WARNING "i2c-algo-bit.o: %s seems to be busy.\n", name);
  194. goto bailout;
  195. }
  196. sdalo(adap);
  197. sda=getsda(adap);
  198. scl=(adap->getscl==NULL?1:getscl(adap));
  199. printk(KERN_DEBUG "i2c-algo-bit.o: (1) scl=%d, sda=%d\n",scl,sda);
  200. if ( 0 != sda ) {
  201. printk(KERN_WARNING "i2c-algo-bit.o: SDA stuck high!\n");
  202. goto bailout;
  203. }
  204. if ( 0 == scl ) {
  205. printk(KERN_WARNING "i2c-algo-bit.o: SCL unexpected low "
  206. "while pulling SDA low!\n");
  207. goto bailout;
  208. }
  209. sdahi(adap);
  210. sda=getsda(adap);
  211. scl=(adap->getscl==NULL?1:getscl(adap));
  212. printk(KERN_DEBUG "i2c-algo-bit.o: (2) scl=%d, sda=%d\n",scl,sda);
  213. if ( 0 == sda ) {
  214. printk(KERN_WARNING "i2c-algo-bit.o: SDA stuck low!\n");
  215. goto bailout;
  216. }
  217. if ( 0 == scl ) {
  218. printk(KERN_WARNING "i2c-algo-bit.o: SCL unexpected low "
  219. "while pulling SDA high!\n");
  220. goto bailout;
  221. }
  222. scllo(adap);
  223. sda=getsda(adap);
  224. scl=(adap->getscl==NULL?0:getscl(adap));
  225. printk(KERN_DEBUG "i2c-algo-bit.o: (3) scl=%d, sda=%d\n",scl,sda);
  226. if ( 0 != scl ) {
  227. printk(KERN_WARNING "i2c-algo-bit.o: SCL stuck high!\n");
  228. goto bailout;
  229. }
  230. if ( 0 == sda ) {
  231. printk(KERN_WARNING "i2c-algo-bit.o: SDA unexpected low "
  232. "while pulling SCL low!\n");
  233. goto bailout;
  234. }
  235. sclhi(adap);
  236. sda=getsda(adap);
  237. scl=(adap->getscl==NULL?1:getscl(adap));
  238. printk(KERN_DEBUG "i2c-algo-bit.o: (4) scl=%d, sda=%d\n",scl,sda);
  239. if ( 0 == scl ) {
  240. printk(KERN_WARNING "i2c-algo-bit.o: SCL stuck low!\n");
  241. goto bailout;
  242. }
  243. if ( 0 == sda ) {
  244. printk(KERN_WARNING "i2c-algo-bit.o: SDA unexpected low "
  245. "while pulling SCL high!\n");
  246. goto bailout;
  247. }
  248. printk(KERN_INFO "i2c-algo-bit.o: %s passed test.\n",name);
  249. return 0;
  250. bailout:
  251. sdahi(adap);
  252. sclhi(adap);
  253. return -ENODEV;
  254. }
  255. /* ----- Utility functions
  256. */
  257. /* try_address tries to contact a chip for a number of
  258. * times before it gives up.
  259. * return values:
  260. * 1 chip answered
  261. * 0 chip did not answer
  262. * -x transmission error
  263. */
  264. static int try_address(struct i2c_adapter *i2c_adap,
  265. unsigned char addr, int retries)
  266. {
  267. struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
  268. int i,ret = -1;
  269. for (i=0;i<=retries;i++) {
  270. ret = i2c_outb(i2c_adap,addr);
  271. if (ret == 1 || i == retries)
  272. break;
  273. i2c_stop(adap);
  274. udelay(5/*adap->udelay*/);
  275. i2c_start(adap);
  276. udelay(adap->udelay);
  277. }
  278. DEB2(if (i)
  279. printk(KERN_DEBUG "i2c-algo-bit.o: Used %d tries to %s client at 0x%02x : %s\n",
  280. i+1, addr & 1 ? "read" : "write", addr>>1,
  281. ret==1 ? "success" : ret==0 ? "no ack" : "failed, timeout?" )
  282. );
  283. return ret;
  284. }
  285. static int sendbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
  286. {
  287. char c;
  288. const char *temp = msg->buf;
  289. int count = msg->len;
  290. unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK;
  291. int retval;
  292. int wrcount=0;
  293. while (count > 0) {
  294. c = *temp;
  295. DEB2(dev_dbg(&i2c_adap->dev, "sendbytes: writing %2.2X\n", c&0xff));
  296. retval = i2c_outb(i2c_adap,c);
  297. if ((retval>0) || (nak_ok && (retval==0))) { /* ok or ignored NAK */
  298. count--;
  299. temp++;
  300. wrcount++;
  301. } else { /* arbitration or no acknowledge */
  302. dev_err(&i2c_adap->dev, "sendbytes: error - bailout.\n");
  303. return (retval<0)? retval : -EFAULT;
  304. /* got a better one ?? */
  305. }
  306. }
  307. return wrcount;
  308. }
  309. static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
  310. {
  311. int inval;
  312. int rdcount=0; /* counts bytes read */
  313. struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
  314. char *temp = msg->buf;
  315. int count = msg->len;
  316. while (count > 0) {
  317. inval = i2c_inb(i2c_adap);
  318. if (inval>=0) {
  319. *temp = inval;
  320. rdcount++;
  321. } else { /* read timed out */
  322. printk(KERN_ERR "i2c-algo-bit.o: readbytes: i2c_inb timed out.\n");
  323. break;
  324. }
  325. temp++;
  326. count--;
  327. if (msg->flags & I2C_M_NO_RD_ACK)
  328. continue;
  329. if ( count > 0 ) { /* send ack */
  330. sdalo(adap);
  331. DEBPROTO(printk(" Am "));
  332. } else {
  333. sdahi(adap); /* neg. ack on last byte */
  334. DEBPROTO(printk(" NAm "));
  335. }
  336. if (sclhi(adap)<0) { /* timeout */
  337. sdahi(adap);
  338. printk(KERN_ERR "i2c-algo-bit.o: readbytes: Timeout at ack\n");
  339. return -ETIMEDOUT;
  340. };
  341. scllo(adap);
  342. sdahi(adap);
  343. }
  344. return rdcount;
  345. }
  346. /* doAddress initiates the transfer by generating the start condition (in
  347. * try_address) and transmits the address in the necessary format to handle
  348. * reads, writes as well as 10bit-addresses.
  349. * returns:
  350. * 0 everything went okay, the chip ack'ed, or IGNORE_NAK flag was set
  351. * -x an error occurred (like: -EREMOTEIO if the device did not answer, or
  352. * -ETIMEDOUT, for example if the lines are stuck...)
  353. */
  354. static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
  355. {
  356. unsigned short flags = msg->flags;
  357. unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK;
  358. struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
  359. unsigned char addr;
  360. int ret, retries;
  361. retries = nak_ok ? 0 : i2c_adap->retries;
  362. if ( (flags & I2C_M_TEN) ) {
  363. /* a ten bit address */
  364. addr = 0xf0 | (( msg->addr >> 7) & 0x03);
  365. DEB2(printk(KERN_DEBUG "addr0: %d\n",addr));
  366. /* try extended address code...*/
  367. ret = try_address(i2c_adap, addr, retries);
  368. if ((ret != 1) && !nak_ok) {
  369. printk(KERN_ERR "died at extended address code.\n");
  370. return -EREMOTEIO;
  371. }
  372. /* the remaining 8 bit address */
  373. ret = i2c_outb(i2c_adap,msg->addr & 0x7f);
  374. if ((ret != 1) && !nak_ok) {
  375. /* the chip did not ack / xmission error occurred */
  376. printk(KERN_ERR "died at 2nd address code.\n");
  377. return -EREMOTEIO;
  378. }
  379. if ( flags & I2C_M_RD ) {
  380. i2c_repstart(adap);
  381. /* okay, now switch into reading mode */
  382. addr |= 0x01;
  383. ret = try_address(i2c_adap, addr, retries);
  384. if ((ret!=1) && !nak_ok) {
  385. printk(KERN_ERR "died at extended address code.\n");
  386. return -EREMOTEIO;
  387. }
  388. }
  389. } else { /* normal 7bit address */
  390. addr = ( msg->addr << 1 );
  391. if (flags & I2C_M_RD )
  392. addr |= 1;
  393. if (flags & I2C_M_REV_DIR_ADDR )
  394. addr ^= 1;
  395. ret = try_address(i2c_adap, addr, retries);
  396. if ((ret!=1) && !nak_ok)
  397. return -EREMOTEIO;
  398. }
  399. return 0;
  400. }
  401. static int bit_xfer(struct i2c_adapter *i2c_adap,
  402. struct i2c_msg msgs[], int num)
  403. {
  404. struct i2c_msg *pmsg;
  405. struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
  406. int i,ret;
  407. unsigned short nak_ok;
  408. i2c_start(adap);
  409. for (i=0;i<num;i++) {
  410. pmsg = &msgs[i];
  411. nak_ok = pmsg->flags & I2C_M_IGNORE_NAK;
  412. if (!(pmsg->flags & I2C_M_NOSTART)) {
  413. if (i) {
  414. i2c_repstart(adap);
  415. }
  416. ret = bit_doAddress(i2c_adap, pmsg);
  417. if ((ret != 0) && !nak_ok) {
  418. DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: NAK from device addr %2.2x msg #%d\n"
  419. ,msgs[i].addr,i));
  420. goto bailout;
  421. }
  422. }
  423. if (pmsg->flags & I2C_M_RD ) {
  424. /* read bytes into buffer*/
  425. ret = readbytes(i2c_adap, pmsg);
  426. DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: read %d bytes.\n",ret));
  427. if (ret < pmsg->len) {
  428. if (ret >= 0)
  429. ret = -EREMOTEIO;
  430. goto bailout;
  431. }
  432. } else {
  433. /* write bytes from buffer */
  434. ret = sendbytes(i2c_adap, pmsg);
  435. DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: wrote %d bytes.\n",ret));
  436. if (ret < pmsg->len) {
  437. if (ret >= 0)
  438. ret = -EREMOTEIO;
  439. goto bailout;
  440. }
  441. }
  442. }
  443. ret = i;
  444. bailout:
  445. i2c_stop(adap);
  446. return ret;
  447. }
  448. static u32 bit_func(struct i2c_adapter *adap)
  449. {
  450. return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
  451. I2C_FUNC_10BIT_ADDR | I2C_FUNC_PROTOCOL_MANGLING;
  452. }
  453. /* -----exported algorithm data: ------------------------------------- */
  454. static const struct i2c_algorithm i2c_bit_algo = {
  455. .master_xfer = bit_xfer,
  456. .functionality = bit_func,
  457. };
  458. /*
  459. * registering functions to load algorithms at runtime
  460. */
  461. int i2c_bit_add_bus(struct i2c_adapter *adap)
  462. {
  463. struct i2c_algo_bit_data *bit_adap = adap->algo_data;
  464. if (bit_test) {
  465. int ret = test_bus(bit_adap, adap->name);
  466. if (ret<0)
  467. return -ENODEV;
  468. }
  469. DEB2(dev_dbg(&adap->dev, "hw routines registered.\n"));
  470. /* register new adapter to i2c module... */
  471. adap->algo = &i2c_bit_algo;
  472. adap->timeout = 100; /* default values, should */
  473. adap->retries = 3; /* be replaced by defines */
  474. return i2c_add_adapter(adap);
  475. }
  476. EXPORT_SYMBOL(i2c_bit_add_bus);
  477. MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
  478. MODULE_DESCRIPTION("I2C-Bus bit-banging algorithm");
  479. MODULE_LICENSE("GPL");
  480. module_param(bit_test, bool, 0);
  481. module_param(i2c_debug, int, S_IRUGO | S_IWUSR);
  482. MODULE_PARM_DESC(bit_test, "Test the lines of the bus to see if it is stuck");
  483. MODULE_PARM_DESC(i2c_debug,
  484. "debug level - 0 off; 1 normal; 2,3 more verbose; 9 bit-protocol");