bttv-audio-hook.c 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. /*
  2. * Handlers for board audio hooks, splitted from bttv-cards
  3. *
  4. * Copyright (c) 2006 Mauro Carvalho Chehab (mchehab@infradead.org)
  5. * This code is placed under the terms of the GNU General Public License
  6. */
  7. /* ----------------------------------------------------------------------- */
  8. /* winview */
  9. #include "bttvp.h"
  10. #include <linux/videodev.h>
  11. static void winview_audio(struct bttv *btv, struct video_audio *v, int set)
  12. {
  13. /* PT2254A programming Jon Tombs, jon@gte.esi.us.es */
  14. int bits_out, loops, vol, data;
  15. if (!set) {
  16. /* Fixed by Leandro Lucarella <luca@linuxmendoza.org.ar (07/31/01) */
  17. v->flags |= VIDEO_AUDIO_VOLUME;
  18. return;
  19. }
  20. /* 32 levels logarithmic */
  21. vol = 32 - ((v->volume>>11));
  22. /* units */
  23. bits_out = (PT2254_DBS_IN_2>>(vol%5));
  24. /* tens */
  25. bits_out |= (PT2254_DBS_IN_10>>(vol/5));
  26. bits_out |= PT2254_L_CHANNEL | PT2254_R_CHANNEL;
  27. data = gpio_read();
  28. data &= ~(WINVIEW_PT2254_CLK| WINVIEW_PT2254_DATA|
  29. WINVIEW_PT2254_STROBE);
  30. for (loops = 17; loops >= 0 ; loops--) {
  31. if (bits_out & (1<<loops))
  32. data |= WINVIEW_PT2254_DATA;
  33. else
  34. data &= ~WINVIEW_PT2254_DATA;
  35. gpio_write(data);
  36. udelay(5);
  37. data |= WINVIEW_PT2254_CLK;
  38. gpio_write(data);
  39. udelay(5);
  40. data &= ~WINVIEW_PT2254_CLK;
  41. gpio_write(data);
  42. }
  43. data |= WINVIEW_PT2254_STROBE;
  44. data &= ~WINVIEW_PT2254_DATA;
  45. gpio_write(data);
  46. udelay(10);
  47. data &= ~WINVIEW_PT2254_STROBE;
  48. gpio_write(data);
  49. }
  50. /* ----------------------------------------------------------------------- */
  51. /* mono/stereo control for various cards (which don't use i2c chips but */
  52. /* connect something to the GPIO pins */
  53. static void
  54. gvbctv3pci_audio(struct bttv *btv, struct video_audio *v, int set)
  55. {
  56. unsigned int con = 0;
  57. if (set) {
  58. gpio_inout(0x300, 0x300);
  59. if (v->mode & VIDEO_SOUND_LANG1)
  60. con = 0x000;
  61. if (v->mode & VIDEO_SOUND_LANG2)
  62. con = 0x300;
  63. if (v->mode & VIDEO_SOUND_STEREO)
  64. con = 0x200;
  65. /* if (v->mode & VIDEO_SOUND_MONO)
  66. * con = 0x100; */
  67. gpio_bits(0x300, con);
  68. } else {
  69. v->mode = VIDEO_SOUND_STEREO |
  70. VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
  71. }
  72. }
  73. static void
  74. gvbctv5pci_audio(struct bttv *btv, struct video_audio *v, int set)
  75. {
  76. unsigned int val, con;
  77. if (btv->radio_user)
  78. return;
  79. val = gpio_read();
  80. if (set) {
  81. con = 0x000;
  82. if (v->mode & VIDEO_SOUND_LANG2) {
  83. if (v->mode & VIDEO_SOUND_LANG1) {
  84. /* LANG1 + LANG2 */
  85. con = 0x100;
  86. }
  87. else {
  88. /* LANG2 */
  89. con = 0x300;
  90. }
  91. }
  92. if (con != (val & 0x300)) {
  93. gpio_bits(0x300, con);
  94. if (bttv_gpio)
  95. bttv_gpio_tracking(btv,"gvbctv5pci");
  96. }
  97. } else {
  98. switch (val & 0x70) {
  99. case 0x10:
  100. v->mode = VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
  101. break;
  102. case 0x30:
  103. v->mode = VIDEO_SOUND_LANG2;
  104. break;
  105. case 0x50:
  106. v->mode = VIDEO_SOUND_LANG1;
  107. break;
  108. case 0x60:
  109. v->mode = VIDEO_SOUND_STEREO;
  110. break;
  111. case 0x70:
  112. v->mode = VIDEO_SOUND_MONO;
  113. break;
  114. default:
  115. v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
  116. VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
  117. }
  118. }
  119. }
  120. /*
  121. * Mario Medina Nussbaum <medisoft@alohabbs.org.mx>
  122. * I discover that on BT848_GPIO_DATA address a byte 0xcce enable stereo,
  123. * 0xdde enables mono and 0xccd enables sap
  124. *
  125. * Petr Vandrovec <VANDROVE@vc.cvut.cz>
  126. * P.S.: At least mask in line above is wrong - GPIO pins 3,2 select
  127. * input/output sound connection, so both must be set for output mode.
  128. *
  129. * Looks like it's needed only for the "tvphone", the "tvphone 98"
  130. * handles this with a tda9840
  131. *
  132. */
  133. static void
  134. avermedia_tvphone_audio(struct bttv *btv, struct video_audio *v, int set)
  135. {
  136. int val = 0;
  137. if (set) {
  138. if (v->mode & VIDEO_SOUND_LANG2) /* SAP */
  139. val = 0x02;
  140. if (v->mode & VIDEO_SOUND_STEREO)
  141. val = 0x01;
  142. if (val) {
  143. gpio_bits(0x03,val);
  144. if (bttv_gpio)
  145. bttv_gpio_tracking(btv,"avermedia");
  146. }
  147. } else {
  148. v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
  149. VIDEO_SOUND_LANG1;
  150. return;
  151. }
  152. }
  153. static void
  154. avermedia_tv_stereo_audio(struct bttv *btv, struct video_audio *v, int set)
  155. {
  156. int val = 0;
  157. if (set) {
  158. if (v->mode & VIDEO_SOUND_LANG2) /* SAP */
  159. val = 0x01;
  160. if (v->mode & VIDEO_SOUND_STEREO) /* STEREO */
  161. val = 0x02;
  162. btaor(val, ~0x03, BT848_GPIO_DATA);
  163. if (bttv_gpio)
  164. bttv_gpio_tracking(btv,"avermedia");
  165. } else {
  166. v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
  167. VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
  168. return;
  169. }
  170. }
  171. /* Lifetec 9415 handling */
  172. static void
  173. lt9415_audio(struct bttv *btv, struct video_audio *v, int set)
  174. {
  175. int val = 0;
  176. if (gpio_read() & 0x4000) {
  177. v->mode = VIDEO_SOUND_MONO;
  178. return;
  179. }
  180. if (set) {
  181. if (v->mode & VIDEO_SOUND_LANG2) /* A2 SAP */
  182. val = 0x0080;
  183. if (v->mode & VIDEO_SOUND_STEREO) /* A2 stereo */
  184. val = 0x0880;
  185. if ((v->mode & VIDEO_SOUND_LANG1) ||
  186. (v->mode & VIDEO_SOUND_MONO))
  187. val = 0;
  188. gpio_bits(0x0880, val);
  189. if (bttv_gpio)
  190. bttv_gpio_tracking(btv,"lt9415");
  191. } else {
  192. /* autodetect doesn't work with this card :-( */
  193. v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
  194. VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
  195. return;
  196. }
  197. }
  198. /* TDA9821 on TerraTV+ Bt848, Bt878 */
  199. static void
  200. terratv_audio(struct bttv *btv, struct video_audio *v, int set)
  201. {
  202. unsigned int con = 0;
  203. if (set) {
  204. gpio_inout(0x180000,0x180000);
  205. if (v->mode & VIDEO_SOUND_LANG2)
  206. con = 0x080000;
  207. if (v->mode & VIDEO_SOUND_STEREO)
  208. con = 0x180000;
  209. gpio_bits(0x180000, con);
  210. if (bttv_gpio)
  211. bttv_gpio_tracking(btv,"terratv");
  212. } else {
  213. v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
  214. VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
  215. }
  216. }
  217. static void
  218. winfast2000_audio(struct bttv *btv, struct video_audio *v, int set)
  219. {
  220. unsigned long val = 0;
  221. if (set) {
  222. /*btor (0xc32000, BT848_GPIO_OUT_EN);*/
  223. if (v->mode & VIDEO_SOUND_MONO) /* Mono */
  224. val = 0x420000;
  225. if (v->mode & VIDEO_SOUND_LANG1) /* Mono */
  226. val = 0x420000;
  227. if (v->mode & VIDEO_SOUND_LANG2) /* SAP */
  228. val = 0x410000;
  229. if (v->mode & VIDEO_SOUND_STEREO) /* Stereo */
  230. val = 0x020000;
  231. if (val) {
  232. gpio_bits(0x430000, val);
  233. if (bttv_gpio)
  234. bttv_gpio_tracking(btv,"winfast2000");
  235. }
  236. } else {
  237. v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
  238. VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
  239. }
  240. }
  241. /*
  242. * Dariusz Kowalewski <darekk@automex.pl>
  243. * sound control for Prolink PV-BT878P+9B (PixelView PlayTV Pro FM+NICAM
  244. * revision 9B has on-board TDA9874A sound decoder).
  245. *
  246. * Note: There are card variants without tda9874a. Forcing the "stereo sound route"
  247. * will mute this cards.
  248. */
  249. static void
  250. pvbt878p9b_audio(struct bttv *btv, struct video_audio *v, int set)
  251. {
  252. unsigned int val = 0;
  253. if (btv->radio_user)
  254. return;
  255. if (set) {
  256. if (v->mode & VIDEO_SOUND_MONO) {
  257. val = 0x01;
  258. }
  259. if ((v->mode & (VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2))
  260. || (v->mode & VIDEO_SOUND_STEREO)) {
  261. val = 0x02;
  262. }
  263. if (val) {
  264. gpio_bits(0x03,val);
  265. if (bttv_gpio)
  266. bttv_gpio_tracking(btv,"pvbt878p9b");
  267. }
  268. } else {
  269. v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
  270. VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
  271. }
  272. }
  273. /*
  274. * Dariusz Kowalewski <darekk@automex.pl>
  275. * sound control for FlyVideo 2000S (with tda9874 decoder)
  276. * based on pvbt878p9b_audio() - this is not tested, please fix!!!
  277. */
  278. static void
  279. fv2000s_audio(struct bttv *btv, struct video_audio *v, int set)
  280. {
  281. unsigned int val = 0xffff;
  282. if (btv->radio_user)
  283. return;
  284. if (set) {
  285. if (v->mode & VIDEO_SOUND_MONO) {
  286. val = 0x0000;
  287. }
  288. if ((v->mode & (VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2))
  289. || (v->mode & VIDEO_SOUND_STEREO)) {
  290. val = 0x1080; /*-dk-???: 0x0880, 0x0080, 0x1800 ... */
  291. }
  292. if (val != 0xffff) {
  293. gpio_bits(0x1800, val);
  294. if (bttv_gpio)
  295. bttv_gpio_tracking(btv,"fv2000s");
  296. }
  297. } else {
  298. v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
  299. VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
  300. }
  301. }
  302. /*
  303. * sound control for Canopus WinDVR PCI
  304. * Masaki Suzuki <masaki@btree.org>
  305. */
  306. static void
  307. windvr_audio(struct bttv *btv, struct video_audio *v, int set)
  308. {
  309. unsigned long val = 0;
  310. if (set) {
  311. if (v->mode & VIDEO_SOUND_MONO)
  312. val = 0x040000;
  313. if (v->mode & VIDEO_SOUND_LANG1)
  314. val = 0;
  315. if (v->mode & VIDEO_SOUND_LANG2)
  316. val = 0x100000;
  317. if (v->mode & VIDEO_SOUND_STEREO)
  318. val = 0;
  319. if (val) {
  320. gpio_bits(0x140000, val);
  321. if (bttv_gpio)
  322. bttv_gpio_tracking(btv,"windvr");
  323. }
  324. } else {
  325. v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
  326. VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
  327. }
  328. }
  329. /*
  330. * sound control for AD-TVK503
  331. * Hiroshi Takekawa <sian@big.or.jp>
  332. */
  333. static void
  334. adtvk503_audio(struct bttv *btv, struct video_audio *v, int set)
  335. {
  336. unsigned int con = 0xffffff;
  337. /* btaor(0x1e0000, ~0x1e0000, BT848_GPIO_OUT_EN); */
  338. if (set) {
  339. /* btor(***, BT848_GPIO_OUT_EN); */
  340. if (v->mode & VIDEO_SOUND_LANG1)
  341. con = 0x00000000;
  342. if (v->mode & VIDEO_SOUND_LANG2)
  343. con = 0x00180000;
  344. if (v->mode & VIDEO_SOUND_STEREO)
  345. con = 0x00000000;
  346. if (v->mode & VIDEO_SOUND_MONO)
  347. con = 0x00060000;
  348. if (con != 0xffffff) {
  349. gpio_bits(0x1e0000,con);
  350. if (bttv_gpio)
  351. bttv_gpio_tracking(btv, "adtvk503");
  352. }
  353. } else {
  354. v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
  355. VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
  356. }
  357. }