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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/drivers/ssi/ssi_core.c
  3.  *
  4.  * This file provides a common framework to allow multiple SSI devices
  5.  * to work together on a single SSI bus.
  6.  *
  7.  * You can use this in two ways:
  8.  *  1. select the device, queue up data, flush the data to the device,
  9.  *     (optionally) purge the received data, deselect the device.
  10.  *  2. select the device, queue up one data word, flush to the device
  11.  *     read data word, queue up next data word, flush to the device...
  12.  *     deselect the device.
  13.  */
  14. #include <linux/module.h>
  15. #include <linux/types.h>
  16. #include <linux/kernel.h>
  17. #include <linux/malloc.h>
  18. #include <linux/init.h>
  19. #include <asm/errno.h>
  20. #include "ssi_bus.h"
  21. #include "ssi_dev.h"
  22. #define DEBUG
  23. /**
  24.  * ssi_core_rcv - pass received SSI data to the device
  25.  * @bus: the bus that the data was received from
  26.  * @data: the data word that was received
  27.  *
  28.  * This function is intended to be called by SSI bus device
  29.  * drivers to pass received data to the device driver.
  30.  */
  31. int ssi_core_rcv(struct ssi_bus *bus, u_int data)
  32. {
  33. struct ssi_dev *dev = bus->dev;
  34. if (dev && dev->rcv)
  35. dev->rcv(dev, data);
  36. return 0;
  37. }
  38. /**
  39.  * ssi_transmit_data - queue SSI data for later transmission
  40.  * @dev: device requesting data to be transmitted
  41.  * @data: data word to be transmitted.
  42.  *
  43.  * Queue one data word of SSI data for later transmission.
  44.  */
  45. int ssi_transmit_data(struct ssi_dev *dev, u_int data)
  46. {
  47. struct ssi_bus *bus = dev->bus;
  48. /*
  49.  * Make sure that we currently own the bus
  50.  */
  51. if (bus->dev != dev)
  52. BUG();
  53. bus->trans(bus, data);
  54. return 0;
  55. }
  56. /**
  57.  * ssi_select_device - select a SSI device for later transactions
  58.  * @dev: device to be selected
  59.  */
  60. int ssi_select_device(struct ssi_bus *bus, struct ssi_dev *dev)
  61. {
  62. int retval;
  63. #ifdef DEBUG
  64. printk("SSI: selecting device %s on bus %sn",
  65. dev ? dev->name : "<none>", bus->name);
  66. #endif
  67. /*
  68.  * Select the device if it wasn't already selected.
  69.  */
  70. retval = 0;
  71. if (bus->dev != dev) {
  72. retval = bus->select(bus, dev);
  73. bus->dev = dev;
  74. }
  75. return retval;
  76. }
  77. /**
  78.  * ssi_register_device - register a SSI device with a SSI bus
  79.  * @bus: bus
  80.  * @dev: SSI device
  81.  */
  82. int ssi_register_device(struct ssi_bus *bus, struct ssi_dev *dev)
  83. {
  84. int retval;
  85. dev->bus = bus;
  86. bus->devices++;
  87. retval = dev->init(dev);
  88. if (retval != 0) {
  89. dev->bus = NULL;
  90. bus->devices--;
  91. } else {
  92. #ifdef DEBUG
  93. printk("SSI: registered new device %s on bus %sn", dev->name, bus->name);
  94. #endif
  95. }
  96. return retval;
  97. }
  98. /**
  99.  * ssi_unregister_device - unregister a SSI device from a SSI bus
  100.  * @dev: SSI device
  101.  */
  102. int ssi_unregister_device(struct ssi_dev *dev)
  103. {
  104. struct ssi_bus *bus = dev->bus;
  105. if (bus->dev == dev)
  106. bus->dev = NULL;
  107. dev->bus = NULL;
  108. bus->devices--;
  109. #ifdef DEBUG
  110. printk("SSI: unregistered device %s on bus %sn", dev->name, bus->name);
  111. #endif
  112. return 0;
  113. }
  114. /**
  115.  * ssi_register_bus - register a SSI bus driver
  116.  * @bus: bus
  117.  */
  118. int ssi_register_bus(struct ssi_bus *bus)
  119. {
  120. int retval;
  121. retval = bus->init(bus);
  122. if (retval == 0) {
  123. bus->devices = 0;
  124. #ifdef DEBUG
  125. printk("SSI: registered new bus %sn", bus->name);
  126. #endif
  127. }
  128. return retval;
  129. }
  130. /**
  131.  * ssi_unregister_bus - unregister a SSI bus driver
  132.  * @bus: bus
  133.  */
  134. int ssi_unregister_bus(struct ssi_bus *bus)
  135. {
  136. int retval = -EBUSY;
  137. if (bus->devices == 0) {
  138. retval = 0;
  139. }
  140. return retval;
  141. }
  142. static int __init ssi_init(void)
  143. {
  144. return 0;
  145. }
  146. static void __exit ssi_exit(void)
  147. {
  148. }
  149. module_init(ssi_init);
  150. module_exit(ssi_exit);