l3.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/linux/l3/l3.h
  3.  *
  4.  *  Copyright (C) 2001 Russell King, All Rights Reserved.
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License.
  9.  *
  10.  * Derived from i2c.h by Simon G. Vogl
  11.  */
  12. #ifndef L3_H
  13. #define L3_H
  14. struct l3_msg {
  15. unsigned char addr; /* slave address */
  16. unsigned char flags;
  17. #define L3_M_RD 0x01
  18. #define L3_M_NOADDR 0x02
  19. unsigned short len; /* msg length */
  20. unsigned char *buf; /* pointer to msg data */
  21. };
  22. #ifdef __KERNEL__
  23. #include <linux/types.h>
  24. #include <linux/list.h>
  25. struct l3_client;
  26. struct l3_ops {
  27. int (*open)(struct l3_client *);
  28. int (*command)(struct l3_client *, int cmd, void *arg);
  29. void (*close)(struct l3_client *);
  30. };
  31. /*
  32.  * A driver is capable of handling one or more physical devices present on
  33.  * L3 adapters. This information is used to inform the driver of adapter
  34.  * events.
  35.  */
  36. struct l3_driver {
  37. /*
  38.  * This name is used to uniquely identify the driver.
  39.  * It should be the same as the module name.
  40.  */
  41. char name[32];
  42. /*
  43.  * Notifies the driver that a new client wishes to use its
  44.  * services.  Note that the module use count will be increased
  45.  * prior to this function being called.  In addition, the
  46.  * clients driver and adapter fields will have been setup.
  47.  */
  48. int (*attach_client)(struct l3_client *);
  49. /*
  50.  * Notifies the driver that the client has finished with its
  51.  * services, and any memory that it allocated for this client
  52.  * should be cleaned up.  In addition the chip should be
  53.  * shut down.
  54.  */
  55. void (*detach_client)(struct l3_client *);
  56. /*
  57.  * Possible operations on the driver.
  58.  */
  59. struct l3_ops *ops;
  60. /*
  61.  * Module structure, if any.
  62.  */
  63. struct module *owner;
  64. /*
  65.  * drivers list
  66.  */
  67. struct list_head drivers;
  68. };
  69. struct l3_adapter;
  70. struct l3_algorithm {
  71. /* textual description */
  72. char name[32];
  73. /* perform bus transactions */
  74. int (*xfer)(struct l3_adapter *, struct l3_msg msgs[], int num);
  75. };
  76. struct semaphore;
  77. /*
  78.  * l3_adapter is the structure used to identify a physical L3 bus along
  79.  * with the access algorithms necessary to access it.
  80.  */
  81. struct l3_adapter {
  82. /*
  83.  * This name is used to uniquely identify the adapter.
  84.  * It should be the same as the module name.
  85.  */
  86. char name[32];
  87. /*
  88.  * the algorithm to access the bus
  89.  */
  90. struct l3_algorithm *algo;
  91. /*
  92.  * Algorithm specific data
  93.  */
  94. void *algo_data;
  95. /*
  96.  * This may be NULL, or should point to the module struct
  97.  */
  98. struct module *owner;
  99. /*
  100.  * private data for the adapter
  101.  */
  102. void *data;
  103. /*
  104.  * Our lock.  Unlike the i2c layer, we allow this to be used for
  105.  * other stuff, like the i2c layer lock.  Some people implement
  106.  * i2c stuff using the same signals as the l3 bus.
  107.  */
  108. struct semaphore *lock;
  109. /*
  110.  * List of attached clients.
  111.  */
  112. struct list_head clients;
  113. /*
  114.  * List of all adapters.
  115.  */
  116. struct list_head adapters;
  117. };
  118. /*
  119.  * l3_client identifies a single device (i.e. chip) that is connected to an 
  120.  * L3 bus. The behaviour is defined by the routines of the driver. This
  121.  * function is mainly used for lookup & other admin. functions.
  122.  */
  123. struct l3_client {
  124. struct l3_adapter *adapter; /* the adapter we sit on */
  125. struct l3_driver *driver; /* and our access routines */
  126. void *driver_data; /* private driver data */
  127. struct list_head __adap;
  128. };
  129. extern int l3_add_adapter(struct l3_adapter *);
  130. extern int l3_del_adapter(struct l3_adapter *);
  131. extern int l3_add_driver(struct l3_driver *);
  132. extern int l3_del_driver(struct l3_driver *);
  133. extern int l3_attach_client(struct l3_client *, const char *, const char *);
  134. extern int l3_detach_client(struct l3_client *);
  135. extern int l3_transfer(struct l3_adapter *, struct l3_msg msgs[], int);
  136. extern int l3_write(struct l3_client *, int, const char *, int);
  137. extern int l3_read(struct l3_client *, int, char *, int);
  138. /**
  139.  * l3_command - send a command to a L3 device driver
  140.  * @client: registered client structure
  141.  * @cmd: device driver command
  142.  * @arg: device driver arguments
  143.  *
  144.  * Ask the L3 device driver to perform some function.  Further information
  145.  * should be sought from the device driver in question.
  146.  *
  147.  * Returns negative error code on failure.
  148.  */
  149. static inline int l3_command(struct l3_client *clnt, int cmd, void *arg)
  150. {
  151. struct l3_ops *ops = clnt->driver->ops;
  152. int ret = -EINVAL;
  153. if (ops && ops->command)
  154. ret = ops->command(clnt, cmd, arg);
  155. return ret;
  156. }
  157. static inline int l3_open(struct l3_client *clnt)
  158. {
  159. struct l3_ops *ops = clnt->driver->ops;
  160. int ret = 0;
  161. if (ops && ops->open)
  162. ret = ops->open(clnt);
  163. return ret;
  164. }
  165. static inline void l3_close(struct l3_client *clnt)
  166. {
  167. struct l3_ops *ops = clnt->driver->ops;
  168. if (ops && ops->close)
  169. ops->close(clnt);
  170. }
  171. #endif
  172. #endif /* L3_H */