i2c-core.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:35k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* i2c-core.c - a device driver for the iic-bus interface      */
  2. /* ------------------------------------------------------------------------- */
  3. /*   Copyright (C) 1995-99 Simon G. Vogl
  4.     This program is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation; either version 2 of the License, or
  7.     (at your option) any later version.
  8.     This program is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.     GNU General Public License for more details.
  12.     You should have received a copy of the GNU General Public License
  13.     along with this program; if not, write to the Free Software
  14.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.      */
  15. /* ------------------------------------------------------------------------- */
  16. /* With some changes from Ky鰏ti M鋖kki <kmalkki@cc.hut.fi>.
  17.    All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl> */
  18. /* $Id: i2c-core.c,v 1.64 2001/08/13 01:35:56 mds Exp $ */
  19. #include <linux/module.h>
  20. #include <linux/kernel.h>
  21. #include <linux/errno.h>
  22. #include <linux/slab.h>
  23. #include <linux/proc_fs.h>
  24. #include <linux/config.h>
  25. #include <linux/i2c.h>
  26. /* ----- compatibility stuff ----------------------------------------------- */
  27. #include <linux/version.h>
  28. #include <linux/init.h>
  29. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,1)
  30. #define init_MUTEX(s) do { *(s) = MUTEX; } while(0)
  31. #endif
  32. #include <asm/uaccess.h>
  33. /* ----- global defines ---------------------------------------------------- */
  34. /* exclusive access to the bus */
  35. #define I2C_LOCK(adap) down(&adap->lock)
  36. #define I2C_UNLOCK(adap) up(&adap->lock) 
  37. #define ADAP_LOCK() down(&adap_lock)
  38. #define ADAP_UNLOCK() up(&adap_lock)
  39. #define DRV_LOCK() down(&driver_lock)
  40. #define DRV_UNLOCK() up(&driver_lock)
  41. #define DEB(x) if (i2c_debug>=1) x;
  42. #define DEB2(x) if (i2c_debug>=2) x;
  43. /* ----- global variables -------------------------------------------------- */
  44. /**** lock for writing to global variables: the adapter & driver list */
  45. struct semaphore adap_lock;
  46. struct semaphore driver_lock;
  47. /**** adapter list */
  48. static struct i2c_adapter *adapters[I2C_ADAP_MAX];
  49. static int adap_count;
  50. /**** drivers list */
  51. static struct i2c_driver *drivers[I2C_DRIVER_MAX];
  52. static int driver_count;
  53. /**** debug level */
  54. static int i2c_debug = 0;
  55. /* ---------------------------------------------------
  56.  * /proc entry declarations
  57.  *----------------------------------------------------
  58.  */
  59. #ifdef CONFIG_PROC_FS
  60. static int i2cproc_init(void);
  61. static void i2cproc_cleanup(void);
  62. #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,3,27))
  63. static void monitor_bus_i2c(struct inode *inode, int fill);
  64. #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */
  65. static ssize_t i2cproc_bus_read(struct file * file, char * buf,size_t count, 
  66.                                 loff_t *ppos);
  67. static int read_bus_i2c(char *buf, char **start, off_t offset, int len,
  68.                            int *eof , void *private);
  69. /* To implement the dynamic /proc/bus/i2c-? files, we need our own 
  70.    implementation of the read hook */
  71. static struct file_operations i2cproc_operations = {
  72. read: i2cproc_bus_read,
  73. };
  74. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,48))
  75. static struct inode_operations i2cproc_inode_operations = {
  76. &i2cproc_operations
  77. };
  78. #endif
  79. static int i2cproc_initialized = 0;
  80. #else /* undef CONFIG_PROC_FS */
  81. #define i2cproc_init() 0
  82. #define i2cproc_cleanup() 0
  83. #endif /* CONFIG_PROC_FS */
  84. /* ---------------------------------------------------
  85.  * registering functions 
  86.  * --------------------------------------------------- 
  87.  */
  88. /* -----
  89.  * i2c_add_adapter is called from within the algorithm layer,
  90.  * when a new hw adapter registers. A new device is register to be
  91.  * available for clients.
  92.  */
  93. int i2c_add_adapter(struct i2c_adapter *adap)
  94. {
  95. int i,j,res;
  96. ADAP_LOCK();
  97. for (i = 0; i < I2C_ADAP_MAX; i++)
  98. if (NULL == adapters[i])
  99. break;
  100. if (I2C_ADAP_MAX == i) {
  101. printk(KERN_WARNING 
  102.        " i2c-core.o: register_adapter(%s) - enlarge I2C_ADAP_MAX.n",
  103. adap->name);
  104. res = -ENOMEM;
  105. goto ERROR0;
  106. }
  107. adapters[i] = adap;
  108. adap_count++;
  109. ADAP_UNLOCK();
  110. /* init data types */
  111. init_MUTEX(&adap->lock);
  112. #ifdef CONFIG_PROC_FS
  113. if (i2cproc_initialized) {
  114. char name[8];
  115. struct proc_dir_entry *proc_entry;
  116. sprintf(name,"i2c-%d", i);
  117. proc_entry = create_proc_entry(name,0,proc_bus);
  118. if (! proc_entry) {
  119. printk("i2c-core.o: Could not create /proc/bus/%sn",
  120.        name);
  121. res = -ENOENT;
  122. goto ERROR1;
  123. }
  124. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,48))
  125. proc_entry->proc_fops = &i2cproc_operations;
  126. #else
  127. proc_entry->ops = &i2cproc_inode_operations;
  128. #endif
  129. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,27))
  130. proc_entry->owner = THIS_MODULE;
  131. #else
  132. proc_entry->fill_inode = &monitor_bus_i2c;
  133. #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */
  134. adap->inode = proc_entry->low_ino;
  135. }
  136. #endif /* def CONFIG_PROC_FS */
  137. /* inform drivers of new adapters */
  138. DRV_LOCK();
  139. for (j=0;j<I2C_DRIVER_MAX;j++)
  140. if (drivers[j]!=NULL && 
  141.     (drivers[j]->flags&(I2C_DF_NOTIFY|I2C_DF_DUMMY)))
  142. /* We ignore the return code; if it fails, too bad */
  143. drivers[j]->attach_adapter(adap);
  144. DRV_UNLOCK();
  145. DEB(printk("i2c-core.o: adapter %s registered as adapter %d.n",
  146.            adap->name,i));
  147. return 0;
  148. ERROR1:
  149. ADAP_LOCK();
  150. adapters[i] = NULL;
  151. adap_count--;
  152. ERROR0:
  153. ADAP_UNLOCK();
  154. return res;
  155. }
  156. int i2c_del_adapter(struct i2c_adapter *adap)
  157. {
  158. int i,j,res;
  159. ADAP_LOCK();
  160. for (i = 0; i < I2C_ADAP_MAX; i++)
  161. if (adap == adapters[i])
  162. break;
  163. if (I2C_ADAP_MAX == i) {
  164. printk( "i2c-core.o: unregister_adapter adap [%s] not found.n",
  165. adap->name);
  166. res = -ENODEV;
  167. goto ERROR0;
  168. }
  169. /* DUMMY drivers do not register their clients, so we have to
  170.  * use a trick here: we call driver->attach_adapter to
  171.  * *detach* it! Of course, each dummy driver should know about
  172.  * this or hell will break loose...
  173.  */
  174. DRV_LOCK();
  175. for (j = 0; j < I2C_DRIVER_MAX; j++) 
  176. if (drivers[j] && (drivers[j]->flags & I2C_DF_DUMMY))
  177. if ((res = drivers[j]->attach_adapter(adap))) {
  178. printk("i2c-core.o: can't detach adapter %s "
  179.        "while detaching driver %s: driver not "
  180.        "detached!",adap->name,drivers[j]->name);
  181. goto ERROR1;
  182. }
  183. DRV_UNLOCK();
  184. /* detach any active clients. This must be done first, because
  185.  * it can fail; in which case we give upp. */
  186. for (j=0;j<I2C_CLIENT_MAX;j++) {
  187. struct i2c_client *client = adap->clients[j];
  188. if (client!=NULL)
  189.     /* detaching devices is unconditional of the set notify
  190.      * flag, as _all_ clients that reside on the adapter
  191.      * must be deleted, as this would cause invalid states.
  192.      */
  193. if ((res=client->driver->detach_client(client))) {
  194. printk("i2c-core.o: adapter %s not "
  195. "unregistered, because client at "
  196. "address %02x can't be detached. ",
  197. adap->name, client->addr);
  198. goto ERROR0;
  199. }
  200. }
  201. #ifdef CONFIG_PROC_FS
  202. if (i2cproc_initialized) {
  203. char name[8];
  204. sprintf(name,"i2c-%d", i);
  205. remove_proc_entry(name,proc_bus);
  206. }
  207. #endif /* def CONFIG_PROC_FS */
  208. adapters[i] = NULL;
  209. adap_count--;
  210. ADAP_UNLOCK();
  211. DEB(printk("i2c-core.o: adapter unregistered: %sn",adap->name));
  212. return 0;
  213. ERROR0:
  214. ADAP_UNLOCK();
  215. return res;
  216. ERROR1:
  217. DRV_UNLOCK();
  218. return res;
  219. }
  220. /* -----
  221.  * What follows is the "upwards" interface: commands for talking to clients,
  222.  * which implement the functions to access the physical information of the
  223.  * chips.
  224.  */
  225. int i2c_add_driver(struct i2c_driver *driver)
  226. {
  227. int i;
  228. DRV_LOCK();
  229. for (i = 0; i < I2C_DRIVER_MAX; i++)
  230. if (NULL == drivers[i])
  231. break;
  232. if (I2C_DRIVER_MAX == i) {
  233. printk(KERN_WARNING 
  234.        " i2c-core.o: register_driver(%s) "
  235.        "- enlarge I2C_DRIVER_MAX.n",
  236. driver->name);
  237. DRV_UNLOCK();
  238. return -ENOMEM;
  239. }
  240. drivers[i] = driver;
  241. driver_count++;
  242. DRV_UNLOCK(); /* driver was successfully added */
  243. DEB(printk("i2c-core.o: driver %s registered.n",driver->name));
  244. ADAP_LOCK();
  245. /* now look for instances of driver on our adapters
  246.  */
  247. if (driver->flags& (I2C_DF_NOTIFY|I2C_DF_DUMMY)) {
  248. for (i=0;i<I2C_ADAP_MAX;i++)
  249. if (adapters[i]!=NULL)
  250. /* Ignore errors */
  251. driver->attach_adapter(adapters[i]);
  252. }
  253. ADAP_UNLOCK();
  254. return 0;
  255. }
  256. int i2c_del_driver(struct i2c_driver *driver)
  257. {
  258. int i,j,k,res;
  259. DRV_LOCK();
  260. for (i = 0; i < I2C_DRIVER_MAX; i++)
  261. if (driver == drivers[i])
  262. break;
  263. if (I2C_DRIVER_MAX == i) {
  264. printk(KERN_WARNING " i2c-core.o: unregister_driver: "
  265.     "[%s] not foundn",
  266. driver->name);
  267. DRV_UNLOCK();
  268. return -ENODEV;
  269. }
  270. /* Have a look at each adapter, if clients of this driver are still
  271.  * attached. If so, detach them to be able to kill the driver 
  272.  * afterwards.
  273.  */
  274. DEB2(printk("i2c-core.o: unregister_driver - looking for clients.n"));
  275. /* removing clients does not depend on the notify flag, else 
  276.  * invalid operation might (will!) result, when using stale client
  277.  * pointers.
  278.  */
  279. ADAP_LOCK(); /* should be moved inside the if statement... */
  280. for (k=0;k<I2C_ADAP_MAX;k++) {
  281. struct i2c_adapter *adap = adapters[k];
  282. if (adap == NULL) /* skip empty entries. */
  283. continue;
  284. DEB2(printk("i2c-core.o: examining adapter %s:n",
  285.     adap->name));
  286. if (driver->flags & I2C_DF_DUMMY) {
  287. /* DUMMY drivers do not register their clients, so we have to
  288.  * use a trick here: we call driver->attach_adapter to
  289.  * *detach* it! Of course, each dummy driver should know about
  290.  * this or hell will break loose...  
  291.  */
  292. if ((res = driver->attach_adapter(adap))) {
  293. printk("i2c-core.o: while unregistering "
  294.        "dummy driver %s, adapter %s could "
  295.        "not be detached properly; driver "
  296.        "not unloaded!",driver->name,
  297.        adap->name);
  298. ADAP_UNLOCK();
  299. return res;
  300. }
  301. } else {
  302. for (j=0;j<I2C_CLIENT_MAX;j++) { 
  303. struct i2c_client *client = adap->clients[j];
  304. if (client != NULL && 
  305.     client->driver == driver) {
  306. DEB2(printk("i2c-core.o: "
  307.     "detaching client %s:n",
  308.             client->name));
  309. if ((res = driver->
  310. detach_client(client)))
  311. {
  312. printk("i2c-core.o: while "
  313.        "unregistering driver "
  314.        "`%s', the client at "
  315.        "address %02x of
  316.        adapter `%s' could not
  317.        be detached; driver
  318.        not unloaded!",
  319.        driver->name,
  320.        client->addr,
  321.        adap->name);
  322. ADAP_UNLOCK();
  323. return res;
  324. }
  325. }
  326. }
  327. }
  328. }
  329. ADAP_UNLOCK();
  330. drivers[i] = NULL;
  331. driver_count--;
  332. DRV_UNLOCK();
  333. DEB(printk("i2c-core.o: driver unregistered: %sn",driver->name));
  334. return 0;
  335. }
  336. int i2c_check_addr (struct i2c_adapter *adapter, int addr)
  337. {
  338. int i;
  339. for (i = 0; i < I2C_CLIENT_MAX ; i++) 
  340. if (adapter->clients[i] && (adapter->clients[i]->addr == addr))
  341. return -EBUSY;
  342. return 0;
  343. }
  344. int i2c_attach_client(struct i2c_client *client)
  345. {
  346. struct i2c_adapter *adapter = client->adapter;
  347. int i;
  348. if (i2c_check_addr(client->adapter,client->addr))
  349. return -EBUSY;
  350. for (i = 0; i < I2C_CLIENT_MAX; i++)
  351. if (NULL == adapter->clients[i])
  352. break;
  353. if (I2C_CLIENT_MAX == i) {
  354. printk(KERN_WARNING 
  355.        " i2c-core.o: attach_client(%s) - enlarge I2C_CLIENT_MAX.n",
  356. client->name);
  357. return -ENOMEM;
  358. }
  359. adapter->clients[i] = client;
  360. adapter->client_count++;
  361. if (adapter->client_register) 
  362. if (adapter->client_register(client)) 
  363. printk("i2c-core.o: warning: client_register seems "
  364.        "to have failed for client %02x at adapter %sn",
  365.        client->addr,adapter->name);
  366. DEB(printk("i2c-core.o: client [%s] registered to adapter [%s](pos. %d).n",
  367. client->name, adapter->name,i));
  368. if(client->flags & I2C_CLIENT_ALLOW_USE)
  369. client->usage_count = 0;
  370. return 0;
  371. }
  372. int i2c_detach_client(struct i2c_client *client)
  373. {
  374. struct i2c_adapter *adapter = client->adapter;
  375. int i,res;
  376. for (i = 0; i < I2C_CLIENT_MAX; i++)
  377. if (client == adapter->clients[i])
  378. break;
  379. if (I2C_CLIENT_MAX == i) {
  380. printk(KERN_WARNING " i2c-core.o: unregister_client "
  381.     "[%s] not foundn",
  382. client->name);
  383. return -ENODEV;
  384. }
  385. if( (client->flags & I2C_CLIENT_ALLOW_USE) && 
  386.     (client->usage_count>0))
  387. return -EBUSY;
  388. if (adapter->client_unregister != NULL) 
  389. if ((res = adapter->client_unregister(client))) {
  390. printk("i2c-core.o: client_unregister [%s] failed, "
  391.        "client not detached",client->name);
  392. return res;
  393. }
  394. adapter->clients[i] = NULL;
  395. adapter->client_count--;
  396. DEB(printk("i2c-core.o: client [%s] unregistered.n",client->name));
  397. return 0;
  398. }
  399. void i2c_inc_use_client(struct i2c_client *client)
  400. {
  401. if (client->driver->inc_use != NULL)
  402. client->driver->inc_use(client);
  403. if (client->adapter->inc_use != NULL)
  404. client->adapter->inc_use(client->adapter);
  405. }
  406. void i2c_dec_use_client(struct i2c_client *client)
  407. {
  408. if (client->driver->dec_use != NULL)
  409. client->driver->dec_use(client);
  410. if (client->adapter->dec_use != NULL)
  411. client->adapter->dec_use(client->adapter);
  412. }
  413. struct i2c_client *i2c_get_client(int driver_id, int adapter_id, 
  414. struct i2c_client *prev)
  415. {
  416. int i,j;
  417. /* Will iterate through the list of clients in each adapter of adapters-list
  418.    in search for a client that matches the search criteria. driver_id or 
  419.    adapter_id are ignored if set to 0. If both are ignored this returns 
  420.    first client found. */
  421. i = j = 0;  
  422. /* set starting point */ 
  423. if(prev)
  424. {
  425. if(!(prev->adapter))
  426. return (struct i2c_client *) -EINVAL;
  427. for(j=0; j < I2C_ADAP_MAX; j++)
  428. if(prev->adapter == adapters[j])
  429. break;
  430. /* invalid starting point? */
  431. if (I2C_ADAP_MAX == j) {
  432. printk(KERN_WARNING " i2c-core.o: get_client adapter for client:[%s] not foundn",
  433. prev->name);
  434. return (struct i2c_client *) -ENODEV;
  435. }
  436. for(i=0; i < I2C_CLIENT_MAX; i++)
  437. if(prev == adapters[j]->clients[i])
  438. break;
  439. /* invalid starting point? */
  440. if (I2C_CLIENT_MAX == i) {
  441. printk(KERN_WARNING " i2c-core.o: get_client client:[%s] not foundn",
  442. prev->name);
  443. return (struct i2c_client *) -ENODEV;
  444. }
  445. i++; /* start from one after prev */
  446. }
  447. for(; j < I2C_ADAP_MAX; j++)
  448. {
  449. if(!adapters[j])
  450. continue;
  451. if(adapter_id && (adapters[j]->id != adapter_id))
  452. continue;
  453. for(; i < I2C_CLIENT_MAX; i++)
  454. {
  455. if(!adapters[j]->clients[i])
  456. continue;
  457. if(driver_id && (adapters[j]->clients[i]->driver->id != driver_id))
  458. continue;
  459. if(adapters[j]->clients[i]->flags & I2C_CLIENT_ALLOW_USE)
  460. return adapters[j]->clients[i];
  461. }
  462. i = 0;
  463. }
  464. return 0;
  465. }
  466. int i2c_use_client(struct i2c_client *client)
  467. {
  468. if(client->flags & I2C_CLIENT_ALLOW_USE) {
  469. if (client->flags & I2C_CLIENT_ALLOW_MULTIPLE_USE) 
  470. client->usage_count++;
  471. else {
  472. if(client->usage_count > 0) 
  473. return -EBUSY;
  474.  else 
  475. client->usage_count++;
  476. }
  477. }
  478. i2c_inc_use_client(client);
  479. return 0;
  480. }
  481. int i2c_release_client(struct i2c_client *client)
  482. {
  483. if(client->flags & I2C_CLIENT_ALLOW_USE) {
  484. if(client->usage_count>0)
  485. client->usage_count--;
  486. else
  487. {
  488. printk(KERN_WARNING " i2c-core.o: dec_use_client used one too many timesn");
  489. return -EPERM;
  490. }
  491. }
  492. i2c_dec_use_client(client);
  493. return 0;
  494. }
  495. /* ----------------------------------------------------
  496.  * The /proc functions
  497.  * ----------------------------------------------------
  498.  */
  499. #ifdef CONFIG_PROC_FS
  500. #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,3,27))
  501. /* Monitor access to /proc/bus/i2c*; make unloading i2c-proc impossible
  502.    if some process still uses it or some file in it */
  503. void monitor_bus_i2c(struct inode *inode, int fill)
  504. {
  505. if (fill)
  506. MOD_INC_USE_COUNT;
  507. else
  508. MOD_DEC_USE_COUNT;
  509. }
  510. #endif /* (LINUX_VERSION_CODE <= KERNEL_VERSION(2,3,37)) */
  511. /* This function generates the output for /proc/bus/i2c */
  512. int read_bus_i2c(char *buf, char **start, off_t offset, int len, int *eof, 
  513.                  void *private)
  514. {
  515. int i;
  516. int nr = 0;
  517. /* Note that it is safe to write a `little' beyond len. Yes, really. */
  518. for (i = 0; (i < I2C_ADAP_MAX) && (nr < len); i++)
  519. if (adapters[i]) {
  520. nr += sprintf(buf+nr, "i2c-%dt", i);
  521. if (adapters[i]->algo->smbus_xfer) {
  522. if (adapters[i]->algo->master_xfer)
  523. nr += sprintf(buf+nr,"smbus/i2c");
  524. else
  525. nr += sprintf(buf+nr,"smbus    ");
  526. } else if (adapters[i]->algo->master_xfer)
  527. nr += sprintf(buf+nr,"i2c       ");
  528. else
  529. nr += sprintf(buf+nr,"dummy     ");
  530. nr += sprintf(buf+nr,"t%-32st%-32sn",
  531.               adapters[i]->name,
  532.               adapters[i]->algo->name);
  533. }
  534. return nr;
  535. }
  536. /* This function generates the output for /proc/bus/i2c-? */
  537. ssize_t i2cproc_bus_read(struct file * file, char * buf,size_t count, 
  538.                          loff_t *ppos)
  539. {
  540. struct inode * inode = file->f_dentry->d_inode;
  541. char *kbuf;
  542. struct i2c_client *client;
  543. int i,j,k,order_nr,len=0,len_total;
  544. int order[I2C_CLIENT_MAX];
  545. if (count > 4000)
  546. return -EINVAL; 
  547. len_total = file->f_pos + count;
  548. /* Too bad if this gets longer (unlikely) */
  549. if (len_total > 4000)
  550. len_total = 4000;
  551. for (i = 0; i < I2C_ADAP_MAX; i++)
  552. if (adapters[i]->inode == inode->i_ino) {
  553. /* We need a bit of slack in the kernel buffer; this makes the
  554.    sprintf safe. */
  555. if (! (kbuf = kmalloc(count + 80,GFP_KERNEL)))
  556. return -ENOMEM;
  557. /* Order will hold the indexes of the clients
  558.    sorted by address */
  559. order_nr=0;
  560. for (j = 0; j < I2C_CLIENT_MAX; j++) {
  561. if ((client = adapters[i]->clients[j]) && 
  562.     (client->driver->id != I2C_DRIVERID_I2CDEV))  {
  563. for(k = order_nr; 
  564.     (k > 0) && 
  565.     adapters[i]->clients[order[k-1]]->
  566.              addr > client->addr; 
  567.     k--)
  568. order[k] = order[k-1];
  569. order[k] = j;
  570. order_nr++;
  571. }
  572. }
  573. for (j = 0; (j < order_nr) && (len < len_total); j++) {
  574. client = adapters[i]->clients[order[j]];
  575. len += sprintf(kbuf+len,"%02xt%-32st%-32sn",
  576.               client->addr,
  577.               client->name,
  578.               client->driver->name);
  579. }
  580. len = len - file->f_pos;
  581. if (len > count)
  582. len = count;
  583. if (len < 0) 
  584. len = 0;
  585. if (copy_to_user (buf,kbuf+file->f_pos, len)) {
  586. kfree(kbuf);
  587. return -EFAULT;
  588. }
  589. file->f_pos += len;
  590. kfree(kbuf);
  591. return len;
  592. }
  593. return -ENOENT;
  594. }
  595. int i2cproc_init(void)
  596. {
  597. struct proc_dir_entry *proc_bus_i2c;
  598. i2cproc_initialized = 0;
  599. if (! proc_bus) {
  600. printk("i2c-core.o: /proc/bus/ does not exist");
  601. i2cproc_cleanup();
  602. return -ENOENT;
  603.   } 
  604. proc_bus_i2c = create_proc_entry("i2c",0,proc_bus);
  605. if (!proc_bus_i2c) {
  606. printk("i2c-core.o: Could not create /proc/bus/i2c");
  607. i2cproc_cleanup();
  608. return -ENOENT;
  609.   }
  610. proc_bus_i2c->read_proc = &read_bus_i2c;
  611. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,27))
  612. proc_bus_i2c->owner = THIS_MODULE;
  613. #else
  614. proc_bus_i2c->fill_inode = &monitor_bus_i2c;
  615. #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,27)) */
  616. i2cproc_initialized += 2;
  617. return 0;
  618. }
  619. static void i2cproc_cleanup(void)
  620. {
  621. if (i2cproc_initialized >= 1) {
  622. remove_proc_entry("i2c",proc_bus);
  623. i2cproc_initialized -= 2;
  624. }
  625. }
  626. #endif /* def CONFIG_PROC_FS */
  627. /* ----------------------------------------------------
  628.  * the functional interface to the i2c busses.
  629.  * ----------------------------------------------------
  630.  */
  631. int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg msgs[],int num)
  632. {
  633. int ret;
  634. if (adap->algo->master_xfer) {
  635.     DEB2(printk("i2c-core.o: master_xfer: %s with %d msgs.n",
  636.             adap->name,num));
  637. I2C_LOCK(adap);
  638. ret = adap->algo->master_xfer(adap,msgs,num);
  639. I2C_UNLOCK(adap);
  640. return ret;
  641. } else {
  642. printk("i2c-core.o: I2C adapter %04x: I2C level transfers not supportedn",
  643.        adap->id);
  644. return -ENOSYS;
  645. }
  646. }
  647. int i2c_master_send(struct i2c_client *client,const char *buf ,int count)
  648. {
  649. int ret;
  650. struct i2c_adapter *adap=client->adapter;
  651. struct i2c_msg msg;
  652. if (client->adapter->algo->master_xfer) {
  653. msg.addr   = client->addr;
  654. msg.flags = client->flags & I2C_M_TEN;
  655. msg.len = count;
  656. (const char *)msg.buf = buf;
  657. DEB2(printk("i2c-core.o: master_send: writing %d bytes on %s.n",
  658. count,client->adapter->name));
  659. I2C_LOCK(adap);
  660. ret = adap->algo->master_xfer(adap,&msg,1);
  661. I2C_UNLOCK(adap);
  662. /* if everything went ok (i.e. 1 msg transmitted), return #bytes
  663.  * transmitted, else error code.
  664.  */
  665. return (ret == 1 )? count : ret;
  666. } else {
  667. printk("i2c-core.o: I2C adapter %04x: I2C level transfers not supportedn",
  668.        client->adapter->id);
  669. return -ENOSYS;
  670. }
  671. }
  672. int i2c_master_recv(struct i2c_client *client, char *buf ,int count)
  673. {
  674. struct i2c_adapter *adap=client->adapter;
  675. struct i2c_msg msg;
  676. int ret;
  677. if (client->adapter->algo->master_xfer) {
  678. msg.addr   = client->addr;
  679. msg.flags = client->flags & I2C_M_TEN;
  680. msg.flags |= I2C_M_RD;
  681. msg.len = count;
  682. msg.buf = buf;
  683. DEB2(printk("i2c-core.o: master_recv: reading %d bytes on %s.n",
  684. count,client->adapter->name));
  685. I2C_LOCK(adap);
  686. ret = adap->algo->master_xfer(adap,&msg,1);
  687. I2C_UNLOCK(adap);
  688. DEB2(printk("i2c-core.o: master_recv: return:%d (count:%d, addr:0x%02x)n",
  689. ret, count, client->addr));
  690. /* if everything went ok (i.e. 1 msg transmitted), return #bytes
  691.   * transmitted, else error code.
  692.   */
  693. return (ret == 1 )? count : ret;
  694. } else {
  695. printk("i2c-core.o: I2C adapter %04x: I2C level transfers not supportedn",
  696.        client->adapter->id);
  697. return -ENOSYS;
  698. }
  699. }
  700. int i2c_control(struct i2c_client *client,
  701. unsigned int cmd, unsigned long arg)
  702. {
  703. int ret = 0;
  704. struct i2c_adapter *adap = client->adapter;
  705. DEB2(printk("i2c-core.o: i2c ioctl, cmd: 0x%x, arg: %#lxn", cmd, arg));
  706. switch ( cmd ) {
  707. case I2C_RETRIES:
  708. adap->retries = arg;
  709. break;
  710. case I2C_TIMEOUT:
  711. adap->timeout = arg;
  712. break;
  713. default:
  714. if (adap->algo->algo_control!=NULL)
  715. ret = adap->algo->algo_control(adap,cmd,arg);
  716. }
  717. return ret;
  718. }
  719. /* ----------------------------------------------------
  720.  * the i2c address scanning function
  721.  * Will not work for 10-bit addresses!
  722.  * ----------------------------------------------------
  723.  */
  724. int i2c_probe(struct i2c_adapter *adapter,
  725.                    struct i2c_client_address_data *address_data,
  726.                    i2c_client_found_addr_proc *found_proc)
  727. {
  728. int addr,i,found,err;
  729. int adap_id = i2c_adapter_id(adapter);
  730. /* Forget it if we can't probe using SMBUS_QUICK */
  731. if (! i2c_check_functionality(adapter,I2C_FUNC_SMBUS_QUICK))
  732. return -1;
  733. for (addr = 0x00; addr <= 0x7f; addr++) {
  734. /* Skip if already in use */
  735. if (i2c_check_addr(adapter,addr))
  736. continue;
  737. /* If it is in one of the force entries, we don't do any detection
  738.    at all */
  739. found = 0;
  740. for (i = 0; !found && (address_data->force[i] != I2C_CLIENT_END); i += 3) {
  741. if (((adap_id == address_data->force[i]) || 
  742.      (address_data->force[i] == ANY_I2C_BUS)) &&
  743.      (addr == address_data->force[i+1])) {
  744. DEB2(printk("i2c-core.o: found force parameter for adapter %d, addr %04xn",
  745.             adap_id,addr));
  746. if ((err = found_proc(adapter,addr,0,0)))
  747. return err;
  748. found = 1;
  749. }
  750. }
  751. if (found) 
  752. continue;
  753. /* If this address is in one of the ignores, we can forget about
  754.    it right now */
  755. for (i = 0;
  756.      !found && (address_data->ignore[i] != I2C_CLIENT_END);
  757.      i += 2) {
  758. if (((adap_id == address_data->ignore[i]) || 
  759.     ((address_data->ignore[i] == ANY_I2C_BUS))) &&
  760.     (addr == address_data->ignore[i+1])) {
  761. DEB2(printk("i2c-core.o: found ignore parameter for adapter %d, "
  762.      "addr %04xn", adap_id ,addr));
  763. found = 1;
  764. }
  765. }
  766. for (i = 0;
  767.      !found && (address_data->ignore_range[i] != I2C_CLIENT_END);
  768.      i += 3) {
  769. if (((adap_id == address_data->ignore_range[i]) ||
  770.     ((address_data->ignore_range[i]==ANY_I2C_BUS))) &&
  771.     (addr >= address_data->ignore_range[i+1]) &&
  772.     (addr <= address_data->ignore_range[i+2])) {
  773. DEB2(printk("i2c-core.o: found ignore_range parameter for adapter %d, "
  774.             "addr %04xn", adap_id,addr));
  775. found = 1;
  776. }
  777. }
  778. if (found) 
  779. continue;
  780. /* Now, we will do a detection, but only if it is in the normal or 
  781.    probe entries */  
  782. for (i = 0;
  783.      !found && (address_data->normal_i2c[i] != I2C_CLIENT_END);
  784.      i += 1) {
  785. if (addr == address_data->normal_i2c[i]) {
  786. found = 1;
  787. DEB2(printk("i2c-core.o: found normal i2c entry for adapter %d, "
  788.             "addr %02x", adap_id,addr));
  789. }
  790. }
  791. for (i = 0;
  792.      !found && (address_data->normal_i2c_range[i] != I2C_CLIENT_END);
  793.      i += 2) {
  794. if ((addr >= address_data->normal_i2c_range[i]) &&
  795.     (addr <= address_data->normal_i2c_range[i+1])) {
  796. found = 1;
  797. DEB2(printk("i2c-core.o: found normal i2c_range entry for adapter %d, "
  798.             "addr %04xn", adap_id,addr));
  799. }
  800. }
  801. for (i = 0;
  802.      !found && (address_data->probe[i] != I2C_CLIENT_END);
  803.      i += 2) {
  804. if (((adap_id == address_data->probe[i]) ||
  805.     ((address_data->probe[i] == ANY_I2C_BUS))) &&
  806.     (addr == address_data->probe[i+1])) {
  807. found = 1;
  808. DEB2(printk("i2c-core.o: found probe parameter for adapter %d, "
  809.             "addr %04xn", adap_id,addr));
  810. }
  811. }
  812. for (i = 0;
  813.      !found && (address_data->probe_range[i] != I2C_CLIENT_END);
  814.      i += 3) {
  815. if (((adap_id == address_data->probe_range[i]) ||
  816.    (address_data->probe_range[i] == ANY_I2C_BUS)) &&
  817.    (addr >= address_data->probe_range[i+1]) &&
  818.    (addr <= address_data->probe_range[i+2])) {
  819. found = 1;
  820. DEB2(printk("i2c-core.o: found probe_range parameter for adapter %d, "
  821.             "addr %04xn", adap_id,addr));
  822. }
  823. }
  824. if (!found) 
  825. continue;
  826. /* OK, so we really should examine this address. First check
  827.    whether there is some client here at all! */
  828. if (i2c_smbus_xfer(adapter,addr,0,0,0,I2C_SMBUS_QUICK,NULL) >= 0)
  829. if ((err = found_proc(adapter,addr,0,-1)))
  830. return err;
  831. }
  832. return 0;
  833. }
  834. /*
  835.  * return id number for a specific adapter
  836.  */
  837. int i2c_adapter_id(struct i2c_adapter *adap)
  838. {
  839. int i;
  840. for (i = 0; i < I2C_ADAP_MAX; i++)
  841. if (adap == adapters[i])
  842. return i;
  843. return -1;
  844. }
  845. /* The SMBus parts */
  846. extern s32 i2c_smbus_write_quick(struct i2c_client * client, u8 value)
  847. {
  848. return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
  849.                         value,0,I2C_SMBUS_QUICK,NULL);
  850. }
  851. extern s32 i2c_smbus_read_byte(struct i2c_client * client)
  852. {
  853. union i2c_smbus_data data;
  854. if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
  855.                    I2C_SMBUS_READ,0,I2C_SMBUS_BYTE, &data))
  856. return -1;
  857. else
  858. return 0x0FF & data.byte;
  859. }
  860. extern s32 i2c_smbus_write_byte(struct i2c_client * client, u8 value)
  861. {
  862. return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
  863.                       I2C_SMBUS_WRITE,value, I2C_SMBUS_BYTE,NULL);
  864. }
  865. extern s32 i2c_smbus_read_byte_data(struct i2c_client * client, u8 command)
  866. {
  867. union i2c_smbus_data data;
  868. if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
  869.                    I2C_SMBUS_READ,command, I2C_SMBUS_BYTE_DATA,&data))
  870. return -1;
  871. else
  872. return 0x0FF & data.byte;
  873. }
  874. extern s32 i2c_smbus_write_byte_data(struct i2c_client * client, u8 command,
  875.                                      u8 value)
  876. {
  877. union i2c_smbus_data data;
  878. data.byte = value;
  879. return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
  880.                       I2C_SMBUS_WRITE,command,
  881.                       I2C_SMBUS_BYTE_DATA,&data);
  882. }
  883. extern s32 i2c_smbus_read_word_data(struct i2c_client * client, u8 command)
  884. {
  885. union i2c_smbus_data data;
  886. if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
  887.                    I2C_SMBUS_READ,command, I2C_SMBUS_WORD_DATA, &data))
  888. return -1;
  889. else
  890. return 0x0FFFF & data.word;
  891. }
  892. extern s32 i2c_smbus_write_word_data(struct i2c_client * client,
  893.                                      u8 command, u16 value)
  894. {
  895. union i2c_smbus_data data;
  896. data.word = value;
  897. return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
  898.                       I2C_SMBUS_WRITE,command,
  899.                       I2C_SMBUS_WORD_DATA,&data);
  900. }
  901. extern s32 i2c_smbus_process_call(struct i2c_client * client,
  902.                                   u8 command, u16 value)
  903. {
  904. union i2c_smbus_data data;
  905. data.word = value;
  906. if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
  907.                    I2C_SMBUS_WRITE,command,
  908.                    I2C_SMBUS_PROC_CALL, &data))
  909. return -1;
  910. else
  911. return 0x0FFFF & data.word;
  912. }
  913. /* Returns the number of read bytes */
  914. extern s32 i2c_smbus_read_block_data(struct i2c_client * client,
  915.                                      u8 command, u8 *values)
  916. {
  917. union i2c_smbus_data data;
  918. int i;
  919. if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
  920.                    I2C_SMBUS_READ,command,
  921.                    I2C_SMBUS_BLOCK_DATA,&data))
  922. return -1;
  923. else {
  924. for (i = 1; i <= data.block[0]; i++)
  925. values[i-1] = data.block[i];
  926. return data.block[0];
  927. }
  928. }
  929. extern s32 i2c_smbus_write_block_data(struct i2c_client * client,
  930.                                       u8 command, u8 length, u8 *values)
  931. {
  932. union i2c_smbus_data data;
  933. int i;
  934. if (length > 32)
  935. length = 32;
  936. for (i = 1; i <= length; i++)
  937. data.block[i] = values[i-1];
  938. data.block[0] = length;
  939. return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
  940.                       I2C_SMBUS_WRITE,command,
  941.                       I2C_SMBUS_BLOCK_DATA,&data);
  942. }
  943. extern s32 i2c_smbus_write_i2c_block_data(struct i2c_client * client,
  944.                                           u8 command, u8 length, u8 *values)
  945. {
  946. union i2c_smbus_data data;
  947. int i;
  948. if (length > 32)
  949. length = 32;
  950. for (i = 1; i <= length; i++)
  951. data.block[i] = values[i-1];
  952. data.block[0] = length;
  953. return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
  954.                       I2C_SMBUS_WRITE,command,
  955.                       I2C_SMBUS_I2C_BLOCK_DATA,&data);
  956. }
  957. /* Simulate a SMBus command using the i2c protocol 
  958.    No checking of parameters is done!  */
  959. static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, 
  960.                                    unsigned short flags,
  961.                                    char read_write, u8 command, int size, 
  962.                                    union i2c_smbus_data * data)
  963. {
  964. /* So we need to generate a series of msgs. In the case of writing, we
  965.   need to use only one message; when reading, we need two. We initialize
  966.   most things with sane defaults, to keep the code below somewhat
  967.   simpler. */
  968. unsigned char msgbuf0[34];
  969. unsigned char msgbuf1[34];
  970. int num = read_write == I2C_SMBUS_READ?2:1;
  971. struct i2c_msg msg[2] = { { addr, flags, 1, msgbuf0 }, 
  972.                           { addr, flags | I2C_M_RD, 0, msgbuf1 }
  973.                         };
  974. int i;
  975. msgbuf0[0] = command;
  976. switch(size) {
  977. case I2C_SMBUS_QUICK:
  978. msg[0].len = 0;
  979. /* Special case: The read/write field is used as data */
  980. msg[0].flags = flags | (read_write==I2C_SMBUS_READ)?I2C_M_RD:0;
  981. num = 1;
  982. break;
  983. case I2C_SMBUS_BYTE:
  984. if (read_write == I2C_SMBUS_READ) {
  985. /* Special case: only a read! */
  986. msg[0].flags = I2C_M_RD | flags;
  987. num = 1;
  988. }
  989. break;
  990. case I2C_SMBUS_BYTE_DATA:
  991. if (read_write == I2C_SMBUS_READ)
  992. msg[1].len = 1;
  993. else {
  994. msg[0].len = 2;
  995. msgbuf0[1] = data->byte;
  996. }
  997. break;
  998. case I2C_SMBUS_WORD_DATA:
  999. if (read_write == I2C_SMBUS_READ)
  1000. msg[1].len = 2;
  1001. else {
  1002. msg[0].len=3;
  1003. msgbuf0[1] = data->word & 0xff;
  1004. msgbuf0[2] = (data->word >> 8) & 0xff;
  1005. }
  1006. break;
  1007. case I2C_SMBUS_PROC_CALL:
  1008. num = 2; /* Special case */
  1009. msg[0].len = 3;
  1010. msg[1].len = 2;
  1011. msgbuf0[1] = data->word & 0xff;
  1012. msgbuf0[2] = (data->word >> 8) & 0xff;
  1013. break;
  1014. case I2C_SMBUS_BLOCK_DATA:
  1015. if (read_write == I2C_SMBUS_READ) {
  1016. printk("i2c-core.o: Block read not supported under "
  1017.        "I2C emulation!n");
  1018. return -1;
  1019. } else {
  1020. msg[0].len = data->block[0] + 2;
  1021. if (msg[0].len > 34) {
  1022. printk("i2c-core.o: smbus_access called with "
  1023.        "invalid block write size (%d)n",
  1024.        msg[0].len);
  1025. return -1;
  1026. }
  1027. for (i = 1; i <= msg[0].len; i++)
  1028. msgbuf0[i] = data->block[i-1];
  1029. }
  1030. break;
  1031. default:
  1032. printk("i2c-core.o: smbus_access called with invalid size (%d)n",
  1033.        size);
  1034. return -1;
  1035. }
  1036. if (i2c_transfer(adapter, msg, num) < 0)
  1037. return -1;
  1038. if (read_write == I2C_SMBUS_READ)
  1039. switch(size) {
  1040. case I2C_SMBUS_BYTE:
  1041. data->byte = msgbuf0[0];
  1042. break;
  1043. case I2C_SMBUS_BYTE_DATA:
  1044. data->byte = msgbuf1[0];
  1045. break;
  1046. case I2C_SMBUS_WORD_DATA: 
  1047. case I2C_SMBUS_PROC_CALL:
  1048. data->word = msgbuf1[0] | (msgbuf1[1] << 8);
  1049. break;
  1050. }
  1051. return 0;
  1052. }
  1053. s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags,
  1054.                    char read_write, u8 command, int size, 
  1055.                    union i2c_smbus_data * data)
  1056. {
  1057. s32 res;
  1058. flags = flags & I2C_M_TEN;
  1059. if (adapter->algo->smbus_xfer) {
  1060. I2C_LOCK(adapter);
  1061. res = adapter->algo->smbus_xfer(adapter,addr,flags,read_write,
  1062.                                 command,size,data);
  1063. I2C_UNLOCK(adapter);
  1064. } else
  1065. res = i2c_smbus_xfer_emulated(adapter,addr,flags,read_write,
  1066.                                       command,size,data);
  1067. return res;
  1068. }
  1069. /* You should always define `functionality'; the 'else' is just for
  1070.    backward compatibility. */ 
  1071. u32 i2c_get_functionality (struct i2c_adapter *adap)
  1072. {
  1073. if (adap->algo->functionality)
  1074. return adap->algo->functionality(adap);
  1075. else
  1076. return 0xffffffff;
  1077. }
  1078. int i2c_check_functionality (struct i2c_adapter *adap, u32 func)
  1079. {
  1080. u32 adap_func = i2c_get_functionality (adap);
  1081. return (func & adap_func) == func;
  1082. }
  1083. static int __init i2c_init(void)
  1084. {
  1085. printk(KERN_DEBUG "i2c-core.o: i2c core modulen");
  1086. memset(adapters,0,sizeof(adapters));
  1087. memset(drivers,0,sizeof(drivers));
  1088. adap_count=0;
  1089. driver_count=0;
  1090. init_MUTEX(&adap_lock);
  1091. init_MUTEX(&driver_lock);
  1092. i2cproc_init();
  1093. return 0;
  1094. }
  1095. EXPORT_SYMBOL(i2c_add_adapter);
  1096. EXPORT_SYMBOL(i2c_del_adapter);
  1097. EXPORT_SYMBOL(i2c_add_driver);
  1098. EXPORT_SYMBOL(i2c_del_driver);
  1099. EXPORT_SYMBOL(i2c_attach_client);
  1100. EXPORT_SYMBOL(i2c_detach_client);
  1101. EXPORT_SYMBOL(i2c_inc_use_client);
  1102. EXPORT_SYMBOL(i2c_dec_use_client);
  1103. EXPORT_SYMBOL(i2c_get_client);
  1104. EXPORT_SYMBOL(i2c_use_client);
  1105. EXPORT_SYMBOL(i2c_release_client);
  1106. EXPORT_SYMBOL(i2c_check_addr);
  1107. EXPORT_SYMBOL(i2c_master_send);
  1108. EXPORT_SYMBOL(i2c_master_recv);
  1109. EXPORT_SYMBOL(i2c_control);
  1110. EXPORT_SYMBOL(i2c_transfer);
  1111. EXPORT_SYMBOL(i2c_adapter_id);
  1112. EXPORT_SYMBOL(i2c_probe);
  1113. EXPORT_SYMBOL(i2c_smbus_xfer);
  1114. EXPORT_SYMBOL(i2c_smbus_write_quick);
  1115. EXPORT_SYMBOL(i2c_smbus_read_byte);
  1116. EXPORT_SYMBOL(i2c_smbus_write_byte);
  1117. EXPORT_SYMBOL(i2c_smbus_read_byte_data);
  1118. EXPORT_SYMBOL(i2c_smbus_write_byte_data);
  1119. EXPORT_SYMBOL(i2c_smbus_read_word_data);
  1120. EXPORT_SYMBOL(i2c_smbus_write_word_data);
  1121. EXPORT_SYMBOL(i2c_smbus_process_call);
  1122. EXPORT_SYMBOL(i2c_smbus_read_block_data);
  1123. EXPORT_SYMBOL(i2c_smbus_write_block_data);
  1124. EXPORT_SYMBOL(i2c_get_functionality);
  1125. EXPORT_SYMBOL(i2c_check_functionality);
  1126. MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
  1127. MODULE_DESCRIPTION("I2C-Bus main module");
  1128. MODULE_PARM(i2c_debug, "i");
  1129. MODULE_PARM_DESC(i2c_debug,"debug level");
  1130. MODULE_LICENSE("GPL");
  1131. module_init(i2c_init);
  1132. module_exit(i2cproc_cleanup);