bttv-audio-hook.c 8.9 KB

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