dice.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /*
  2. * dice.h - a part of driver for Dice based devices
  3. *
  4. * Copyright (c) Clemens Ladisch
  5. * Copyright (c) 2014 Takashi Sakamoto
  6. *
  7. * Licensed under the terms of the GNU General Public License, version 2.
  8. */
  9. #ifndef SOUND_DICE_H_INCLUDED
  10. #define SOUND_DICE_H_INCLUDED
  11. #include <linux/compat.h>
  12. #include <linux/completion.h>
  13. #include <linux/delay.h>
  14. #include <linux/device.h>
  15. #include <linux/firewire.h>
  16. #include <linux/firewire-constants.h>
  17. #include <linux/jiffies.h>
  18. #include <linux/module.h>
  19. #include <linux/mod_devicetable.h>
  20. #include <linux/mutex.h>
  21. #include <linux/slab.h>
  22. #include <linux/spinlock.h>
  23. #include <linux/wait.h>
  24. #include <sound/control.h>
  25. #include <sound/core.h>
  26. #include <sound/firewire.h>
  27. #include <sound/hwdep.h>
  28. #include <sound/info.h>
  29. #include <sound/initval.h>
  30. #include <sound/pcm.h>
  31. #include <sound/pcm_params.h>
  32. #include <sound/rawmidi.h>
  33. #include "../amdtp-am824.h"
  34. #include "../iso-resources.h"
  35. #include "../lib.h"
  36. #include "dice-interface.h"
  37. struct snd_dice {
  38. struct snd_card *card;
  39. struct fw_unit *unit;
  40. spinlock_t lock;
  41. struct mutex mutex;
  42. bool registered;
  43. struct delayed_work dwork;
  44. /* Offsets for sub-addresses */
  45. unsigned int global_offset;
  46. unsigned int rx_offset;
  47. unsigned int tx_offset;
  48. unsigned int sync_offset;
  49. unsigned int rsrv_offset;
  50. unsigned int clock_caps;
  51. unsigned int tx_channels[3];
  52. unsigned int rx_channels[3];
  53. unsigned int tx_midi_ports[3];
  54. unsigned int rx_midi_ports[3];
  55. struct fw_address_handler notification_handler;
  56. int owner_generation;
  57. u32 notification_bits;
  58. /* For uapi */
  59. int dev_lock_count; /* > 0 driver, < 0 userspace */
  60. bool dev_lock_changed;
  61. wait_queue_head_t hwdep_wait;
  62. /* For streaming */
  63. struct fw_iso_resources tx_resources;
  64. struct fw_iso_resources rx_resources;
  65. struct amdtp_stream tx_stream;
  66. struct amdtp_stream rx_stream;
  67. bool global_enabled;
  68. struct completion clock_accepted;
  69. unsigned int substreams_counter;
  70. };
  71. enum snd_dice_addr_type {
  72. SND_DICE_ADDR_TYPE_PRIVATE,
  73. SND_DICE_ADDR_TYPE_GLOBAL,
  74. SND_DICE_ADDR_TYPE_TX,
  75. SND_DICE_ADDR_TYPE_RX,
  76. SND_DICE_ADDR_TYPE_SYNC,
  77. SND_DICE_ADDR_TYPE_RSRV,
  78. };
  79. int snd_dice_transaction_write(struct snd_dice *dice,
  80. enum snd_dice_addr_type type,
  81. unsigned int offset,
  82. void *buf, unsigned int len);
  83. int snd_dice_transaction_read(struct snd_dice *dice,
  84. enum snd_dice_addr_type type, unsigned int offset,
  85. void *buf, unsigned int len);
  86. static inline int snd_dice_transaction_write_global(struct snd_dice *dice,
  87. unsigned int offset,
  88. void *buf, unsigned int len)
  89. {
  90. return snd_dice_transaction_write(dice,
  91. SND_DICE_ADDR_TYPE_GLOBAL, offset,
  92. buf, len);
  93. }
  94. static inline int snd_dice_transaction_read_global(struct snd_dice *dice,
  95. unsigned int offset,
  96. void *buf, unsigned int len)
  97. {
  98. return snd_dice_transaction_read(dice,
  99. SND_DICE_ADDR_TYPE_GLOBAL, offset,
  100. buf, len);
  101. }
  102. static inline int snd_dice_transaction_write_tx(struct snd_dice *dice,
  103. unsigned int offset,
  104. void *buf, unsigned int len)
  105. {
  106. return snd_dice_transaction_write(dice, SND_DICE_ADDR_TYPE_TX, offset,
  107. buf, len);
  108. }
  109. static inline int snd_dice_transaction_read_tx(struct snd_dice *dice,
  110. unsigned int offset,
  111. void *buf, unsigned int len)
  112. {
  113. return snd_dice_transaction_read(dice, SND_DICE_ADDR_TYPE_TX, offset,
  114. buf, len);
  115. }
  116. static inline int snd_dice_transaction_write_rx(struct snd_dice *dice,
  117. unsigned int offset,
  118. void *buf, unsigned int len)
  119. {
  120. return snd_dice_transaction_write(dice, SND_DICE_ADDR_TYPE_RX, offset,
  121. buf, len);
  122. }
  123. static inline int snd_dice_transaction_read_rx(struct snd_dice *dice,
  124. unsigned int offset,
  125. void *buf, unsigned int len)
  126. {
  127. return snd_dice_transaction_read(dice, SND_DICE_ADDR_TYPE_RX, offset,
  128. buf, len);
  129. }
  130. static inline int snd_dice_transaction_write_sync(struct snd_dice *dice,
  131. unsigned int offset,
  132. void *buf, unsigned int len)
  133. {
  134. return snd_dice_transaction_write(dice, SND_DICE_ADDR_TYPE_SYNC, offset,
  135. buf, len);
  136. }
  137. static inline int snd_dice_transaction_read_sync(struct snd_dice *dice,
  138. unsigned int offset,
  139. void *buf, unsigned int len)
  140. {
  141. return snd_dice_transaction_read(dice, SND_DICE_ADDR_TYPE_SYNC, offset,
  142. buf, len);
  143. }
  144. int snd_dice_transaction_get_clock_source(struct snd_dice *dice,
  145. unsigned int *source);
  146. int snd_dice_transaction_set_rate(struct snd_dice *dice, unsigned int rate);
  147. int snd_dice_transaction_get_rate(struct snd_dice *dice, unsigned int *rate);
  148. int snd_dice_transaction_set_enable(struct snd_dice *dice);
  149. void snd_dice_transaction_clear_enable(struct snd_dice *dice);
  150. int snd_dice_transaction_init(struct snd_dice *dice);
  151. int snd_dice_transaction_reinit(struct snd_dice *dice);
  152. void snd_dice_transaction_destroy(struct snd_dice *dice);
  153. #define SND_DICE_RATES_COUNT 7
  154. extern const unsigned int snd_dice_rates[SND_DICE_RATES_COUNT];
  155. int snd_dice_stream_get_rate_mode(struct snd_dice *dice,
  156. unsigned int rate, unsigned int *mode);
  157. int snd_dice_stream_start_duplex(struct snd_dice *dice, unsigned int rate);
  158. void snd_dice_stream_stop_duplex(struct snd_dice *dice);
  159. int snd_dice_stream_init_duplex(struct snd_dice *dice);
  160. void snd_dice_stream_destroy_duplex(struct snd_dice *dice);
  161. void snd_dice_stream_update_duplex(struct snd_dice *dice);
  162. int snd_dice_stream_lock_try(struct snd_dice *dice);
  163. void snd_dice_stream_lock_release(struct snd_dice *dice);
  164. int snd_dice_create_pcm(struct snd_dice *dice);
  165. int snd_dice_create_hwdep(struct snd_dice *dice);
  166. void snd_dice_create_proc(struct snd_dice *dice);
  167. int snd_dice_create_midi(struct snd_dice *dice);
  168. #endif